2016-02-11 520 views
2

我正在处理图像处理问题,并且我的数据以三维NumPy数组的形式呈现,其中(x,y,z)条目是图像z的(x,y)像素(数值强度值)。有100000个图像,每个图像是25x25。因此,数据矩阵的大小为25x25x10000。我试图将其转换为尺寸为10000x625的2维矩阵,其中每行都是图像中像素的线性化。例如,假设而不是图像是3×3,我们有以下几点:将三维NumPy数组转换为二维NumPy数组时出现问题

1 2 3 
4 5 6 ------> [1, 2, 3, 4, 5, 6, 7, 8, 9] 
7 8 9 

我试图通过调用data.reshape((10000, 625))要做到这一点,但是数据不再这样做后正确对齐。我曾尝试在重塑的有效阶段转置矩阵,但似乎没有解决它。

有谁知道如何解决这个问题?

回答

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的需要你知道哪些元素重塑过程中属于彼此,所以只有“合并”属于一个整体的尺寸。

0

问题是,您不符合reshape调用中的标准索引顺序。如果要组合的两个维度在新阵列中位于相同位置( - >(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使用的打印布局如何使这种推理更容易。第一步和第二步之间的差异仅在的支架位置处为;数字都留在同一个地方,当你想要考虑形状问题时,这通常会有所帮助。