无法重塑numpy数组

时间:2013-11-27 21:12:05

标签: python numpy multidimensional-array reshape

我有一个函数,它应该采用1D整数数组并将其整形为1x3数组的2D数组。然后它应该采用每个1x3阵列并将其转换为3x1阵列。结果应该是3x1阵列的2D数组。这是我的功能

def RGBtoLMS(rgbValues, rgbLength): #Method to convert from RGB to LMS
    print rgbValues
    lmsValues = rgbValues.reshape(-1, 3)
    print lmsValues
    for i in xrange(len(lmsValues)):
        lmsValues[i] = lmsValues[i].reshape(3, 1)

    return lmsValues

当我尝试将1x3阵列更改为3x1阵列时,问题就出现了。假设rgbValues = [14,25,19,24,25,28,58,87,43],我得到以下输出

[14 25 19 ..., 58 87 43]
[[14 25 19]
 [24, 25, 28]
 [58 87 43]]

ValueError [on line lmsValues[i] = lmsValues[i].reshape(3, 1)]: could not broadcast input array from shape (3,1) into shape (3)

如何避免此错误?

1 个答案:

答案 0 :(得分:6)

如评论中所述,您实际上只是修改一个具有不同形状的数组。在numpy中说你有一个1 x 3数组的二维数组并没有多大意义。实际上是一个n x 3数组。

我们从一个长度为3*n的1d数组开始(我在您的示例中添加了三个数字,以区分3 x nn x 3数组:

>>> import numpy as np

>>> rgbValues = np.array([14, 25, 19, 24, 25, 28, 58, 87, 43, 1, 2, 3])
>>> rgbValues.shape
(12,)

并将其重塑为n x 3

>>> lmsValues = rgbValues.reshape(-1, 3)
>>> lmsValues
array([[14, 25, 19],
       [24, 25, 28],
       [58, 87, 43],
       [ 1,  2,  3]])
>>> lmsValues.shape
(4, 3)

如果您希望每个元素都被整形3 x 1,那么您可能只想转置数组。这会切换行和列,因此形状为3 x n

>>> lmsValues.T
array([[14, 24, 58,  1],
       [25, 25, 87,  2],
       [19, 28, 43,  3]])

>>> lmsValues.T.shape
(3, 4)

>>> lmsValues.T[0]
array([14, 24, 58,  1])

>>> lmsValues.T[0].shape
(4,)

如果您确实希望lmsValues中的每个元素成为1 x 3数组,那么您可以这样做,但它必须是形状为{{的3d数组1}}:

n x 1 x 3