2012-11-06 31 views
6

Ho una matrice numpy e vorrei concatenare tutte le righe insieme, così finisco con un array lungo.Concatena tutte le righe di una matrice numpy in python

#example 

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

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

Il modo in cui lo sto facendo ora non sembra pitonico. Sono sicuro che c'è un modo migliore.

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

Grazie per l'aiuto.

+0

@senderle - Ravel è stato il mio primo istinto troppo (grazie Pierre GM!) . Posta come risposta e sarò felicemente revocata. – mgilson

risposta

7

Vorrei suggerire il metodo di ndarrayravel o flatten.

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

ravel è più veloce di concatenate e flatten perché non restituire una copia a meno che non deve:

>>> 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]]) 

Ma se avete bisogno di una copia di evitare la condivisione di memoria illustrata in precedenza, è' re meglio utilizzando flatten di concatenate, come si può vedere da questi tempi:

>>> %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 ote anche che è possibile ottenere l'esatto risultato che l'output illustra (un one-riga 2-d array) con reshape:

>>> 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 Bella analisi, impari qualcosa di nuovo ogni giorno. – Maehler

+1

Nota che 'ravel' o' flatten' trasformerà il tuo array 2D in un array 1D --- cioè, passando da una '(N, M)' a una forma '(N * M,)'. L'OP potrebbe voler aggiungere un '.reshape (1, -1)' per forzare l'output su un array 2D (1 riga, molte colonne). –

+0

Ovviamente, se vuoi semplicemente trasformare il tuo array 2D in 1D, tanto più veloce è 'your_array.shape = -1' ... –

3

È possibile utilizzare il NumPy concatenate function:

>>> 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]) 

Si potrebbe anche provare flatten:

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

Sembra esattamente ciò che l'utente desidera. – orlp

+0

Perfetto! grazie – user1764386

Problemi correlati