一个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 评论的那样。
假设我想在 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 评论的那样。