为什么 3d 数组的打印结果与 python 中相同的心理可视化结果不同?

Why is the print result of 3d arrays different from the mental visualisation of the same in python?

我正在学习机器学习,没有太多编码经验。在尝试理解 3d 数组时,我被指示将 2x4x3 数组可视化为:

但是当我使用以下方法创建具有相同形状的随机数组时:

X = np.random.randint(10, size=(2, 4, 3))
print(X)

输出是

[[[6 1 0]
  [6 6 5]
  [2 7 0]
  [5 4 3]]

 [[7 8 2]
  [9 1 2]
  [2 0 1]
  [8 0 9]]]

我觉得这像是 4x3x2。

我把2x4x3理解成上面给出的图像是不是错了?为什么 python 会像这样打印 3d 数组?最后,如果我的想象是正确的,生成的随机值在图像中是如何排列的?

是2×4×3。第一维是最外层的。我们看到外部列表(见外部方括号)有两个元素:

<b>[</b>[[6, 1, 0],
  [6, 6, 5],
  [2, 7, 0],
  [5, 4, 3]]<b>,</b>

 [[7, 8, 2],
  [9, 1, 2],
  [2, 0, 1],
  [8, 0, 9]]<b>]</b>

其中每一项都具有相同的维度:一个 4×3 矩阵。事实上,如果看一下列表的第一项,我们有:

<b>[</b>[6, 1, 0]<b>,</b>
 [6, 6, 5]<b>,</b>
 [2, 7, 0]<b>,</b>
 [5, 4, 3]<b>]</b>

这里有四行,如果我们看一下第一行,我们会看到一个包含三个元素的集合:

<b>[</b>6<b>,</b> 1<b>,</b> 0<b>]</b>

MATLAB/Octave 确实将此 3d 数组显示为 3 个 (2,4) 矩阵块

>> reshape(1:24,2, 4, 3)
ans =

ans(:,:,1) =

   1   3   5   7
   2   4   6   8

ans(:,:,2) =

    9   11   13   15
   10   12   14   16

ans(:,:,3) =

   17   19   21   23
   18   20   22   24

但这里尾随维度是最外层的。这称为列主要或 Fortran 约定。请注意值是如何增加的,沿着列向下。

但在 numpy 中,主要维度是最外层的。值跨行增加。这是行优先或 C 排序

In [22]: np.arange(1,25).reshape(2,4,3)                                         
Out[22]: 
array([[[ 1,  2,  3],
        [ 4,  5,  6],
        [ 7,  8,  9],
        [10, 11, 12]],

       [[13, 14, 15],
        [16, 17, 18],
        [19, 20, 21],
        [22, 23, 24]]])

此维度排序与等效列表中的嵌套相匹配:

In [24]: np.arange(1,25).reshape(2,4,3).tolist()                                
Out[24]: 
[[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]],
 [[13, 14, 15], [16, 17, 18], [19, 20, 21], [22, 23, 24]]]

维度的含义来自于应用程序和用户,而不是来自Python/numpy。图像通常是(高度、宽度、通道)。在计算上,将一个像素的通道的 3(或 4)个元素保持在一起可能很方便,也就是说,使其成为最后一个维度。因此,您的 (2,4,3) 可以被认为是具有 3 种颜色 (rgb) 的 (2,4) 图像。正常的 numpy 打印不是可视化的最佳选择。

但是如果图像是(400, 600, 3) 形状的,我们就不需要'print'的数组了。我们想要一个绘图或图像显示,一张图片,将最后一个维度呈现为颜色。