2017-02-02 6 views
1

空のNumPy配列から始めて、それに連続して行を追加したい(すべての行は同じ長さです)。しかし、最初は行の長さを知りませんし、追加する行数もわかりません。これどうやってするの?私の3行のだから、NumPy配列を連結する

a = np.array([1, 1, 1]) 
b = np.array([2, 2, 2]) 
c = np.array([3, 3, 3]) 

ここでは、私が試してみましたものです:

x = [] 
x = np.concatenate(x, a) 
x = np.concatenate(x, b) 
x = np.concatenate(x, c) 

これは動作しませんでした、それは長さ6の単一のアレイにabを連結しているため、 (2,3)の配列ではなく、サイズの配列です。 ヘルプがありますか?

+3

は、「私は空のnumpyの配列から始め、その後、順次、それに行を追加したい」 - numpyのアレイで動作するようにatrociously非効率的な方法であることが判明しています。一度に配列を構築できない場合は、リストに行を累積し、最後に行を1つのステップで貼り付けます。 – user2357112

+0

これは、あなたが '連結 'と呼ばれる方法ではありません。結合したい配列のリストを提供します。連結する第2引数は '軸'です。 – hpaulj

答えて

2

は、リスト内のすべての行を収集し、その後vstackを使用します。

a = np.array([1, 1, 1]) 
b = np.array([2, 2, 2]) 
c = np.array([3, 3, 3]) 
x = np.vstack([a,b,c]) 
+2

このnp.array([a、b、c])は 'np.stack([a、b、c]、axis = 0)'と同様に動作します。 – hpaulj

0

代わりの

x = [] 

から始まるあなたは

x = numpy.zeros([0, 3]) # 2-dimensional array with 0 rows and 3 columns 

を言うと、その後の行をこのように追加することができます。

x = numpy.vstack([x, a]) 
x = numpy.vstack([x, b]) 
x = numpy.vstack([x, c]) 

...しかしuser2357112が指摘したように、それは、リストで始まるx.append(each_array)を行い、そして唯一の右端に単一numpy.ndarrayへの配列のリストを連結するためにはるかに効率的です:

x = [] 
x.append(a) 
x.append(b) 
x.append(c) 
x = numpy.vstack(x) 

NB :numpy.concatenateのデフォルトの方向が実際に従来の2次元配列内の列間方向としての思想、あなたの配列abcaxis=0、ですが、ためnumpy.concatenate([x,a])は、あなたが期待していなかった方向に働いていましたはではありません。 2次元配列であるため、最初は "行"として考えることはできません。 次元0なので、既存の要素は次元0に沿って変化します。連結する次元は同じです。あなたが意図したことをするには、a = numpy.array([[1,1,1]])のように二重括弧を使って定義するか、連結前にb = b[numpy.newaxis, :]と言って既存の1次元状態から変換する必要があります。 numpy.vstackは暗黙のうちに後者を行います。

0

もう1つの方法は、numpy.concatenateです。ベクトル/行列/配列を連結する軸を選択できるので、numpy.vstackまたはnumpy.hstackより一般的です。

例:

>>> X, Y, Z, T = numpy.random.randint(low=0, high=10, size=(4, 3, 1), dtype='I') 
>>> numpy.concatenate((X, Y, Z, T), axis=1) 
array([[0, 7, 1, 7], 
     [8, 4, 7, 7], 
     [1, 9, 9, 7]], dtype=uint32) 
関連する問題