2013-11-27 3 views
6

1D配列の整数を取り、それを1x3配列の2次元配列に整形する関数があります。次に、各1x3配列を取り出し、それを3x1配列にシフトすることになっています。結果は、3x1配列の2次元配列であると考えられます。ここに私の機能numpy配列を再構成できません

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 

私は3×1アレイに1×3アレイを変更しようとすると問題が上昇しています。私はどのように私はこのエラーを回避することができます[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) 

次の出力は= rgbValuesを想定してもらいますか?

+1

1x3アレイの2Dアレイとは、形状(n、n、1,3)ですか?ここの例は、明確にするのに役立ちます! –

+1

主な問題は、 'lmsValues'の各エントリが既に指定された形状を持っているため、異なる形状のものにそれを割り当てることはできません。しかし、私は@ AndyHaydenに同意します。あなたの入力と期待される出力の簡単な例があなたの質問に答えるのに役立つでしょう。 – cm2

+0

編集されました。もっと明確になるはずです –

答えて

5

コメントに記載されているとおり、実際には常に1つの配列を異なる形で変更しています。 1 x 3配列の2次元配列を持っていると言うのはnumpyでは意味がありません。それは実際にはn 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ように、それを再構築:

は、我々は長さ3*n(私は明確3 x nn x 3配列の違いを作るためにあなたの例に3つの数字を追加しました)の1次元配列を開始します。

>>> 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を形にしたい場合は、多分あなただけの配列を転置します。形状は、あなたが本当にlmsValues各要素1 x 3配列になりたい場合は、あなたがそれを行うことができます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,) 

ですが、それは形状の3D配列である必要がありますので、これは、行と列を切り替えn x 1 x 3

>>> 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) 
+1

実際、1x3配列の2D配列は4D配列になります。あるいは、各要素が2D 1x3配列である 'dtype = object'の2次元配列であってもよい。それらの両方は間違いなく実行可能です。しかしどちらも、OPが実際にやりたいと思うもののようには見えません。私はこの答えは、たとえ彼がそれを知らなくても、彼が実際に何を望んでいるのかと思います。 – abarnert

+0

ハハ、意味的に、あなたは正しいと思いますが、@abarnertはサイズ変更を伴うでしょうか?あるいは、それは '(n、1、1、3)'、LOLとすることができると思います。しかし、ええ、私の推測は転置は彼が後になっているものです。 – askewchan

+0

はい、サイズ変更なしで、 '(n、1、1、3)'です。または '(1、n、1、3)'。各ディメンションを一度持ち上げたり、同じディメンションを2回連続してリストするのは不合理なのでしょうか?あなたが何をしようとしているかによって、1x3配列の2D配列が必要な理由がわかりません。 (特に私は彼が実際にそれを望んでいるとは思っていないので、彼は1X3アレイの1Dアレイを望んでいます。 – abarnert

関連する問題