将3维NumPy数组转换为2维NumPy数组时出现问题

3
我正在处理与图像处理相关的问题,我的数据呈现为一个三维NumPy数组,其中(x,y,z)条目是图像z的(x,y)像素(数值强度值)。有100000个图像,每个图像都是25x25。因此,数据矩阵的大小为25x25x10000。我正在尝试将其转换为大小为10000x625的二维矩阵,其中每一行都是图像像素的线性化。例如,假设图像是3x3,我们将得到以下结果:
1 2 3
4 5 6  ------> [1, 2, 3, 4, 5, 6, 7, 8, 9]
7 8 9

我试图通过调用data.reshape((10000, 625))来实现这一点,但是在这样做之后,数据不再正确对齐。我尝试在有效的重塑阶段转置矩阵,但似乎并没有解决问题。
有人知道如何解决吗?
2个回答

1
如果您希望数据对齐,需要执行 data.reshape((625, 10000))
如果您想要不同的布局,请尝试 np.rollaxis
data_rolled = np.rollaxis(data, 2, 0) # This is Shape (10000, 25, 25)
data_reshaped = data_rolled.reshape(10000, 625) # Now you can do your reshape.

Numpy需要您在重新塑形时知道哪些元素属于一起,因此只能“合并”彼此相邻的维度。

0
问题在于您在reshape调用中没有遵守标准索引顺序。只有当您要合并的两个维度在新数组中处于相同位置时,数据才会对齐((25, 25, 10000) -> (625, 10000))。
然后,为了获得所需的形状,您可以进行转置。使用较小的示例更容易进行可视化--当您遇到此类问题时,如果可能,请尝试在REPL中尝试较小的示例。
>>> a = numpy.arange(12)
>>> a = a.reshape(2, 2, 3)
>>> a
array([[[ 0,  1,  2],
        [ 3,  4,  5]],

       [[ 6,  7,  8],
        [ 9, 10, 11]]])
>>> a.reshape(4, 3)
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]])
>>> a.reshape(4, 3).T
array([[ 0,  3,  6,  9],
       [ 1,  4,  7, 10],
       [ 2,  5,  8, 11]])

无需进行rollaxis操作!

请注意,numpy使用的打印布局使这种推理更容易。第一步和第二步之间的区别仅在于括号位置;数字始终保持在相同的位置,这通常有助于解决形状问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接