麻烦将三维NumPy阵列重塑为二维NumPy阵列

时间:2016-02-11 11:49:50

标签: python arrays numpy indexing reshape

我正在处理图像处理问题,我的数据显示为三维NumPy数组,其中(x,y,z)条目是(x,y)像素(数值强度值)图像z。有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 个答案:

答案 0 :(得分:0)

如果您想要对齐数据,则需要执行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需要您在重塑期间知道哪些元素属于一起,因此只能“合并”属于一起的维度。

答案 1 :(得分: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使用的打印布局如何使这种推理更容易。第一步和第二步之间的差异仅在支架位置;所有数字都保留在同一个地方,这通常有助于您想要考虑形状问题。