【问题标题】:Why is the print result of 3d arrays different from the mental visualisation of the same in python?为什么 3d 数组的打印结果与 python 中相同的心理可视化结果不同?
【发布时间】:2020-02-09 18:10:22
【问题描述】:

我正在学习机器学习,但我没有太多编码经验。在尝试理解 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 数组?最后,如果我的心理可视化是正确的,那么生成的随机值在图像中是如何排列的?

【问题讨论】:

  • 列表中有两个二维矩阵,每个矩阵有四行三列,所以确实是2x4x3。
  • 确实存在约定,但归根结底,每个轴所代表的含义的解释取决于您、您的合作者以及您使用的工具和库。另见en.wikipedia.org/wiki/Row-_and_column-major_order

标签: python arrays numpy multidimensional-array reshape


【解决方案1】:

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) 形状,我们不想要数组的“打印”。我们想要一个绘图或图像显示,一张图片,将最后一个维度呈现为颜色。

【讨论】:

    【解决方案2】:

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

    [[[6, 1, 0],
      [6, 6, 5],
      [2, 7, 0],
      [5, 4, 3]],
    
     [[7, 8, 2],
      [9, 1, 2],
      [2, 0, 1],
      [8, 0, 9]]]

    这些项目中的每一个都具有相同的尺寸:一个 4×3 矩阵。事实上,如果看一下列表的第一项,我们有:

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

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

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

    【讨论】:

    • 那么,像这样可视化它是不是错误的:i.imgur.com/bNCzhbf.png
    • @JithinKrishnaCT:您显示的图像可能应该具有3x2x4 的尺寸。或者至少我是这样解释的。但当然,维度“行走”的顺序是任意的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    相关资源
    最近更新 更多