2012-11-06 18 views
6

Mam macierz numpy i chciałbym połączyć wszystkie wiersze razem, więc kończę jedną długą tablicą.Połączyć wszystkie wiersze macierzy numpy w pythoniu

#example 

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

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

Sposób, w jaki teraz to robię, nie wydaje się być pytoniczny. Jestem pewien, że jest lepszy sposób.

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

Dziękuję za pomoc.

+0

@senderle - Ravel był moim pierwszym odruchem też (dzięki Pierre GM!) . Napisz jako odpowiedź, a ja z radością przegłosuję. – mgilson

Odpowiedz

7

Proponuję metodę ndarrayravel lub flatten.

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

ravel jest szybszy niż concatenate i flatten ponieważ nie zwraca kopię, chyba że ma się do:

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

Ale jeśli potrzebujesz kopię uniknąć pamięć dzielenia pokazano powyżej,” re lepiej wyłączyć za pomocą flatten niż concatenate, jak widać z tych taktowania:

>>> %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 Uwaga również, że można osiągnąć dokładny wynik że wyjście ilustruje (jednowierszowego 2-d tablicy) z 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 Niezła analiza, codziennie uczysz się czegoś nowego. – Maehler

+1

Zauważ, że 'ravel' lub' flatten' przekształci twoją tablicę 2D w tablicę 1D --- tzn. Przełączając się z '(N, M)' na kształt '(N * M,)'. OP może chcieć dodać '.reshape (1, -1)', aby wymusić wyjście do tablicy 2D (1 wiersz, wiele kolumn). –

+0

Oczywiście, jeśli chcesz po prostu przekształcić twoją tablicę 2D w 1D, tym szybciej jest 'twoje_array.shape = -1' ... –

3

Można użyć 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]) 

Można również spróbować flatten:

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

Wygląda dokładnie tak, jak tego chce użytkownik. – orlp

+0

Idealny! dziękuję – user1764386

Powiązane problemy