一个numpy ndarray的解读

Interpretation of a numpy ndarray

假设我想在 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 -> [0,0,0]

1 -> [0,0,1]

2 -> [0,0,2]

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

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

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

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