web-dev-qa-db-ja.com

numpy配列の形状を変更できません

整数の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)

このエラーを回避するにはどうすればよいですか?

10
Nick Gilbert

コメントで述べたように、実際には常に1つの配列を異なる形状で変更しているだけです。 1 x 3配列の2D配列があると言っても、numpyではあまり意味がありません。それが実際に何であるかは、実際にはn x 3配列です。

長さ3*nの1d配列から始めます(3 x n配列とn x 3配列の違いを明確にするために、例に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配列にしたい場合は、それを行うことができますが、形状がn x 1 x 3の3D配列である必要があります。

>>> lmsValues = rgbValues.reshape(-1, 1, 3)
>>> lmsValues
array([[[14, 25, 19]],

       [[24, 25, 28]],

       [[58, 87, 43]],

       [[ 1,  2,  3]]])

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

>>> lmsValues[0]
array([[14, 25, 19]])

>>> lmsValues[0].shape
(1, 3)
8
askewchan