为什么 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'的数组了。我们想要一个绘图或图像显示,一张图片,将最后一个维度呈现为颜色。
我正在学习机器学习,没有太多编码经验。在尝试理解 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'的数组了。我们想要一个绘图或图像显示,一张图片,将最后一个维度呈现为颜色。