我正在学习机器学习,但没有太多编码经验。在尝试理解 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 数组?最后,如果我的想象是正确的,生成的随机值在图像中是如何排列的?
最佳答案
MATLAB/Octave 确实将此 3 维数组显示为 3 个 (2,4) 矩阵 block
>> 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。图像通常是(高度、宽度、 channel )。在计算上,将一个像素的 channel 的 3(或 4)个元素保持在一起可能很方便,也就是说,使其成为最后一个维度。因此,您的 (2,4,3) 可以被认为是具有 3 种颜色 (rgb) 的 (2,4) 图像。普通的 numpy
打印不是可视化的最佳选择。
但是如果图像是 (400, 600, 3) 形状,我们不需要数组的“打印”。我们想要一个绘图或图像显示,一张图片,将最后一个维度呈现为颜色。
关于python - 为什么 3d 数组的打印结果与 python 中相同的心理可视化不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58354395/