【问题标题】:Interpretation of a numpy ndarray一个 numpy ndarray 的解释
【发布时间】:2019-02-27 19:35:57
【问题描述】:

假设我想在一个 numpy 3-D 数组中表示具有 3 个颜色通道 (RGB) 的大小为 H*W 的图像,使得维度为 (H, W, 3)。让我们举一个简单的例子(4,2,3)。所以我们创建一个这样的数组 - img = np.arange(24).reshape(4,2,3)

为了适合上面图片示例的类比,元素的值应该是-

Channel R: [0,1],[2,3],[4,5],[6,7]
Channel G: [8,9],[10,11],[12,13],[14,15]
Channel B: [16,17],[18,19],[20,21],[22,24]

即3个外部数组,上面的数组嵌套在里面。

但是,np.arange(24).reshape(4,2,3) 的结果是 -

array([[[ 0,  1,  2],
        [ 3,  4,  5]],

       [[ 6,  7,  8],
        [ 9, 10, 11]],

       [[12, 13, 14],
        [15, 16, 17]],

       [[18, 19, 20],
        [21, 22, 23]]])

如果我想要第一个频道的第一行,即img[0,:,0],我希望结果是 [0,1],但实际上我会得到 [0,3]。

我知道如果我用形状 (3,4,2) 初始化 ndarray,我会得到我想要的。但我想使用 (H,W,depth) 的传统形状。

你能帮我理解一下我理解上的差距吗?

【问题讨论】:

  • 第一个0 选择显示中的第一个平面或块。把它想象成一个 (2,3) 形状的数组。第二个0 从该数组中选择第一列。要获得[0,1],您必须使用img[0,0,:2]],即第一个块的第一行,以及该行的前两项。
  • np.array([R,G,B]) 应该产生一个 (3,4,2) 数组。在numpy 中,第一个维度是最外层。这与 MATLAB 正好相反。
  • 谢谢@hpaulj!那么,用 np ndarray 表示H pixel * W pixel * 3 color channels 的图像的通常推荐方法是什么?也许只有我一个人,但我觉得这些形状对于图像表示不是很直观。
  • 颜色通道通常是最后一个维度。例如,这就是 matplotlib imshow 所期望的,matplotlib.org/api/_as_gen/…

标签: python numpy numpy-ndarray


【解决方案1】:

我认为您的误解是因为您(错误地)假设从向量到数组的转换首先开始填充第一个索引。实际上,它从最后一个索引开始并向前移动。 在您的示例中,填充数组的顺序是

0 -> [0,0,0]

1 -> [0,0,1]

2 -> [0,0,2]

3 -> [0,1,0] 等等。

因此,第一个像素是 [0,1,2],第二个像素是 [3,4,5],您会得到您所看到的结果。

误解完全在于您如何将向量转换为这样的矩阵(并存储在后台)。一旦你定义了图像,一切都应该如你所愿。

顺便说一句:正如 hpaulj 评论的那样,您可能确实会遇到以 [3,X,Y] 大小保存的图像。

【讨论】:

  • 感谢@Xenon 提供的详细信息,很有帮助!
猜你喜欢
  • 2021-10-15
  • 1970-01-01
  • 2018-06-05
  • 2021-03-30
  • 2018-10-31
  • 2018-10-10
  • 1970-01-01
  • 2011-05-02
  • 2023-03-10
相关资源
最近更新 更多