2014-12-17 14 views
17

Supponiamo di averlo;Come convertire la lista di array numpy in un singolo array numpy?

LIST = [[array([1, 2, 3, 4, 5]), array([1, 2, 3, 4, 5],[1,2,3,4,5])] # inner lists are numpy arrays 

Provo a convertire;

array([[1, 2, 3, 4, 5], 
     [1, 2, 3, 4, 5], 
     [1, 2, 3, 4, 5]) 

mi risolverlo per iterazione sulla vstack in questo momento, ma è molto lento per particolarmente grande ELENCO

Cosa suggerisci per il miglior modo efficiente?

+2

'np.array (LIST)'? – user545424

+3

'np.vstack (LIST)'? – HYRY

+2

'LIST = [[array ([1, 2, 3, 4, 5]), array ([1, 2, 3, 4, 5], [1,2,3,4,5])]' questo non è corretta la sintassi python. Si prega di precisare. – Marcin

risposta

24

In generale è possibile concatenare un'intera sequenza di array lungo un asse:

numpy.concatenate(LIST, axis=0) 

ma fare deve preoccuparsi per la forma e la dimensionalità di ogni matrice nella lista (per un 2-dimensionale 5x3 output, è necessario assicurarsi che siano già tutti gli array bidimensionali n-by-3). Se si desidera concatenare gli array monodimensionali come righe di un output bidimensionale, è necessario espandere la loro dimensionalità.

vstack è una soluzione più semplice da utilizzare poiché richiede una sequenza di array 1 e/o bidimensionale ed espande automaticamente la dimensionalità ove necessario, prima di concatenare l'intera lista. Dove è richiesta una nuova dimensione, viene aggiunta a sinistra, quindi ogni array 1D di n diventa un array 2D 1-by-n. Anche in questo caso, è possibile concatenare un intero elenco contemporaneamente senza dover scorrere:

numpy.vstack(LIST) 

C'è anche una funzione analoga hstack per concatenare 1- e/o 2-D array come colonne di un'uscita 2-D (dove è necessaria l'espansione, viene aggiunta una nuova dimensione sulla destra in modo che un array 1D di tipo n diventi un array 2D n -by-1).

Infine, nel caso specifico di impilamento verticale di matrici 1-D, il seguente funziona anche:

numpy.array(LIST) 

... perché gli array possono essere costruiti su una sequenza di altri array, aggiungendo un nuovo dimensione all'inizio

+3

Penso che volesse un array 2d come output. – Beefster

0

A partire da NumPy versione 1.10, abbiamo il metodo stack. Si può impilare le matrici di ogni dimensione (tutti uguali):

# List of arrays. 
L = [np.random.randn(5,4,2,5,1,2) for i in range(10)] 

# Stack them using axis=0. 
M = np.stack(L) 
M.shape # == (10,5,4,2,5,1,2) 
np.all(M == L) # == True 

M = np.stack(L, axis=1) 
M.shape # == (5,10,4,2,5,1,2) 
np.all(M == L) # == False (Don't Panic) 

# This are all true  
np.all(M[:,0,:] == L[0]) # == True 
all(np.all(M[:,i,:] == L[i]) for i in range(10)) # == True 

Godetevi,