2016-08-09 4 views
4

np.appendに問題があります。ValueError:すべての入力配列の寸法が同じでなければなりません

私は以下のコード使用して20x361行列n_list_convertedの最後の列を複製しようとしている:

n_last = [] 
n_last = n_list_converted[:, -1] 
n_lists = np.append(n_list_converted, n_last, axis=1) 

をしかし、私はエラーを取得する:

ValueError: all the input arrays must have same number of dimensions

は、しかし、私は行列をチェックしました

print(n_last.shape, type(n_last), n_list_converted.shape, type(n_list_converted)) 

を行って、寸法と私は

を取得

(20L,) (20L, 361L)

したがって、寸法は一致していますか?間違いはどこですか?

+5

'np.column_stack'を試してください。 – Divakar

+2

それは働いた!しかし、なぜ? – odo22

答えて

5

Iは、3×4配列で始まり、そして軸1と、3×1アレイを連結した場合、Iは3×5アレイ得る:両方の入力が2つの寸法を有する連結すること

In [911]: x = np.arange(12).reshape(3,4) 
In [912]: np.concatenate([x,x[:,-1:]], axis=1) 
Out[912]: 
array([[ 0, 1, 2, 3, 3], 
     [ 4, 5, 6, 7, 7], 
     [ 8, 9, 10, 11, 11]]) 
In [913]: x.shape,x[:,-1:].shape 
Out[913]: ((3, 4), (3, 1)) 

に注意。

省略:、及びx[:,-1](3)の形状である - それは1Dであり、したがってエラー:

In [914]: np.concatenate([x,x[:,-1]], axis=1) 
... 
ValueError: all the input arrays must have same number of dimensions 

np.appendのコードは

(軸が指定され、この場合)であります
return concatenate((arr, values), axis=axis) 

したがって、構文のわずかな変更で、appendが機能します。リストの代わりに2つの引数が必要です。これはリストappendを真似しますが、そのリストメソッドと混同してはいけません。

return np.concatenate([np.atleast_1d(a) for a in arrs], 1) 

をだから、同じx[:,-1:]入力が必要です。

In [916]: np.append(x, x[:,-1:], axis=1) 
Out[916]: 
array([[ 0, 1, 2, 3, 3], 
     [ 4, 5, 6, 7, 7], 
     [ 8, 9, 10, 11, 11]]) 

np.hstack最初は、すべての入力がatleast_1dされ、その後、連結ん確認します。本質的に同じ行動。

np.column_stackはまた、軸1上CONCATENATEを行うしかし、最初に、これは(3,1)配列には、(3)配列を回すの一般的な方法である

array(arr, copy=False, subok=True, ndmin=2).T 

を通して1D入力を渡します。

In [922]: np.array(x[:,-1], copy=False, subok=True, ndmin=2).T 
Out[922]: 
array([[ 3], 
     [ 7], 
     [11]]) 
In [923]: np.column_stack([x,x[:,-1]]) 
Out[923]: 
array([[ 0, 1, 2, 3, 3], 
     [ 4, 5, 6, 7, 7], 
     [ 8, 9, 10, 11, 11]]) 

すべてのこれらの「スタック」は便利なことができますが、長い目で見れば、それは寸法とベースnp.concatenateを理解することが重要です。このような関数のコードを調べる方法も知っています。私はipython??の魔法をたくさん使っています。

時間テストでは、np.concatenateが顕著に高速です。このような小さな配列では、関数呼び出しの余分なレイヤーが大きな時間差を作ります。

3

(n、)と(n、1)は同じ形状ではありません。 [:, None]表記を使用して配列にベクトルをキャストしてみてください。

また
n_lists = np.append(n_list_converted, n_last[:, None], axis=1) 

n_lastを抽出するとき、あなたが(20, 1)配列を取得するために

n_last = n_list_converted[:, -1:] 

を使用することができます。

2

エラーが発生する理由は、1行n列の行列が長さnの配列と異なるためです。

hstack()vstack()を代わりに使用することをおすすめします。このよう :

import numpy as np 
a = np.arange(32).reshape(4,8) # 4 rows 8 columns matrix. 
b = a[:,-1:]     # last column of that matrix. 

result = np.hstack((a,b))  # stack them horizontally like this: 
#array([[ 0, 1, 2, 3, 4, 5, 6, 7, 7], 
#  [ 8, 9, 10, 11, 12, 13, 14, 15, 15], 
#  [16, 17, 18, 19, 20, 21, 22, 23, 23], 
#  [24, 25, 26, 27, 28, 29, 30, 31, 31]]) 

お知らせ繰り返さ "7、15、23、31" の列。 a[:,-1]の代わりにa[:,-1:]を使用しました。私のバージョンでは、列を生成します。代わりに、行の

array([[7], 
     [15], 
     [23], 
     [31]]) 

array([7,15,23,31])


編集:append()が遅くくらいです。 this answerを読んでください。

+0

'np.append'はリスト' .append'よりも遅いです。スタックに匹敵します。 'np.concatenate'を使います。 – hpaulj

+0

@hpaulj So ... 'append'と' stack'の使用は2つの行列で同じであり、 'stack'は2つ以上の要素の方が良いと言われていますので、' stack'は常に少なくとも_ '。 – RuRo

関連する問題