2012-11-06 15 views
6

私はnumpy行列を持ち、すべての行を連結したいので、1つのlong配列で終わります。Pythonのnumpy行列のすべての行を連結する

#example 

input: 
[[1 2 3] 
[4 5 6} 
[7 8 9]] 

output: 
[[1 2 3 4 5 6 7 8 9]] 

今私はそれをやっている方法は、pythonicようではありません。私は良い方法があると確信しています。

combined_x = x[0] 
for index, row in enumerate(x): 
    if index!= 0: 
     combined_x = np.concatenate((combined_x,x[index]),axis=1) 

ありがとうございました。あなたがnumpyのconcatenate function使用することができ

+0

@senderleを - ラヴェルはあまりにも私の最初の本能だった(おかげピエールGMを!) 。答えとして投稿して、私はうれしくupvoteします。 – mgilson

答えて

7

私はndarrayravelまたはflatten方法をお勧めします。

>>> a = numpy.arange(9).reshape(3, 3) 
>>> a.ravel() 
array([0, 1, 2, 3, 4, 5, 6, 7, 8]) 

ravelそれが持っていない限り、それはコピーを返さないためconcatenateflattenよりも高速です:

>>> a.ravel()[5] = 99 
>>> a 
array([[ 0, 1, 2], 
     [ 3, 4, 99], 
     [ 6, 7, 8]]) 
>>> a.flatten()[5] = 77 
>>> a 
array([[ 0, 1, 2], 
     [ 3, 4, 99], 
     [ 6, 7, 8]]) 

しかし、あなたは上に示したメモリの共有を避けるために、コピーが必要な場合は、あなたの」

>>> %timeit a.ravel() 
1000000 loops, best of 3: 468 ns per loop 
>>> %timeit a.flatten() 
1000000 loops, best of 3: 1.42 us per loop 
>>> %timeit numpy.concatenate(a) 
100000 loops, best of 3: 2.26 us per loop 

N:あなたはこれらのタイミングから見ることができるように、concatenateよりflattenを使用してオフに再より良いですOTEはまた、あなたはあなたの出力はreshapeと(1行2次元配列)を示し正確な結果を達成できること:

>>> a = numpy.arange(9).reshape(3, 3) 
>>> a.reshape(1, -1) 
array([[0, 1, 2, 3, 4, 5, 6, 7, 8]]) 
>>> %timeit a.reshape(1, -1) 
1000000 loops, best of 3: 736 ns per loop 
+0

+1素敵な分析、あなたは毎日何か新しいことを学びます。 – Maehler

+1

'ravel'または' flatten'は、2D配列を1D配列に変換する、つまり '(N、M)'から '(N * M、)'シェイプに切り替えることに注意してください。 OPは '.extape(1、-1)'を追加して出力を2D配列(1行、多くの列)に強制することができます。 –

+0

もちろん、2D配列を1次元に変換したいのであれば、 'your_array.shape = -1'の方が速いです... –

3

>>> ar = np.array([[1,2,3],[4,5,6],[7,8,9]]) 
>>> np.concatenate(ar) 
array([1, 2, 3, 4, 5, 6, 7, 8, 9]) 

をまたflattenを試みることができる:

>>> ar.flatten() 
array([1, 2, 3, 4, 5, 6, 7, 8, 9]) 
+0

ユーザーが望むものとまったく同じです。 – orlp

+0

パーフェクト!ありがとうございます – user1764386