我正在处理图像处理问题,我的数据显示为三维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))
来执行此操作,但在执行此操作后数据不再正确对齐。我已经尝试在重塑的有效阶段转置矩阵,但这似乎并没有解决它。
有谁知道如何解决这个问题?
答案 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
使用的打印布局如何使这种推理更容易。第一步和第二步之间的差异仅在支架位置;所有数字都保留在同一个地方,这通常有助于您想要考虑形状问题。