Elenco di elenchi in matrice numpy


183

Come posso convertire un semplice elenco di elenchi in una matrice numpy? Le righe sono singole liste secondarie e ogni riga contiene gli elementi nella lista secondaria.

Risposte:


199

Se il tuo elenco di elenchi contiene elenchi con un numero variabile di elementi, la risposta di Ignacio Vazquez-Abrams non funzionerà. Invece ci sono almeno 3 opzioni:

1) Crea una matrice di array:

x=[[1,2],[1,2,3],[1]]
y=numpy.array([numpy.array(xi) for xi in x])
type(y)
>>><type 'numpy.ndarray'>
type(y[0])
>>><type 'numpy.ndarray'>

2) Crea una serie di elenchi:

x=[[1,2],[1,2,3],[1]]
y=numpy.array(x)
type(y)
>>><type 'numpy.ndarray'>
type(y[0])
>>><type 'list'>

3) Per prima cosa fai in modo che le liste siano uguali in lunghezza:

x=[[1,2],[1,2,3],[1]]
length = max(map(len, x))
y=numpy.array([xi+[None]*(length-len(xi)) for xi in x])
y
>>>array([[1, 2, None],
>>>       [1, 2, 3],
>>>       [1, None, None]], dtype=object)

15
Grazie, sono venuto qui per questo. Ho usato numpy per un po 'e ho trovato questo comportamento non banale. Grazie per aver dedicato del tempo a spiegare questo caso più generale.
Adam Hughes,

dtype=floatfunziona anche, verrà convertito Nonein np.nan, che può essere utile.

107
>>> numpy.array([[1, 2], [3, 4]]) 
array([[1, 2], [3, 4]])

13
questo converte automaticamente un elenco di elenchi in un array 2D perché la lunghezza di tutti gli elenchi inclusi è la stessa. Sai come non farlo: crea una matrice di liste anche se tutte le liste hanno la stessa lunghezza? O è possibile convertire un array 2D in un array 1D di array 1D (in modo efficiente, intendo, nessun metodo iterativo o roba su mappa python)
Juh_4

7
Se questo non funziona per te perché le tue liste non sono di dimensioni pari, vedi la seguente risposta .
Nikana Reklawyks,

@NikanaReklawyks Ero confuso dopo aver visto la risposta, ma il tuo commento è stato utile. Ho scoperto che il mio elenco di elenchi era frastagliato, quando non doveva essere.
Nikhil Girraj,

39

Poiché questa è la ricerca principale su Google per convertire un elenco di elenchi in un array Numpy, offrirò quanto segue nonostante la domanda abbia 4 anni:

>>> x = [[1, 2], [1, 2, 3], [1]]
>>> y = numpy.hstack(x)
>>> print(y)
[1 2 1 2 3 1]

Quando ho pensato di farlo in questo modo, ero abbastanza soddisfatto di me stesso perché è davvero semplice. Tuttavia, dopo averlo cronometrato con un elenco più ampio di elenchi, in realtà è più veloce farlo:

>>> y = numpy.concatenate([numpy.array(i) for i in x])
>>> print(y)
[1 2 1 2 3 1]

Nota che la risposta n. 1 di @ Bastiaan non crea un unico elenco continuo, quindi ho aggiunto il concatenate .

Comunque ... preferisco l' hstackapproccio per l'uso elegante di Numpy.


12
mentre alcune persone potrebbero essere alla ricerca di questo, sono abbastanza sicuro che l'OP volesse un nparr multidimensionale.
Nathan,

1
Stavo cercando questo :))
Pallie il

26

È semplice come:

>>> lists = [[1, 2], [3, 4]]
>>> np.array(lists)
array([[1, 2],
       [3, 4]])

6

Ancora una volta, dopo aver cercato il problema di convertire elenchi nidificati con livelli N in un array N-dimensionale non ho trovato nulla, quindi ecco come aggirarlo:

import numpy as np

new_array=np.array([[[coord for coord in xk] for xk in xj] for xj in xi], ndmin=3) #this case for N=3

Si noti che se si dispone già della struttura degli elenchi nidificati, non è necessaria la [...[...[...]]]parte. Devi solo chiamare np.array, con ndmin=number-of-list-layers. (anche se nel mio caso avevo bisogno ndmin=number-of-list-layers-minus-1per qualche motivo, altrimenti ho creato un ulteriore livello - è necessario indagare)
Venryx,

Ah, okay, il problema nel mio caso è che per il "layer list" più profondo, gli elenchi non avevano tutti la stessa lunghezza, il che ha causato np.arraysemplicemente "il wrapping" di questi elenchi più profondi piuttosto che convertirli in array intorpiditi.
Venryx

-2

Avevo un elenco di elenchi di uguale lunghezza. Anche allora Ignacio Vazquez-Abramsla risposta non ha funzionato per me. Ho un array numpy 1-D i cui elementi sono liste. Se hai riscontrato lo stesso problema, puoi utilizzare il metodo seguente

Uso numpy.vstack

import numpy as np

np_array = np.empty((0,4), dtype='float')
for i in range(10)
     row_data = ...   # get row_data as list
     np_array = np.vstack((np_array, np.array(row_data)))

1
perché mai continueresti ad impilare se sapessi di avere 10 liste, perché non np.empty ((10, 4)) e poi riempirlo?
Mehdi

-4

Usa solo i panda

list(pd.DataFrame(listofstuff).melt().values)

funziona solo per un elenco di elenchi

se disponi di un elenco di elenchi di elenchi, ti consigliamo di provare qualcosa sulla falsariga di

lists(pd.DataFrame(listofstuff).melt().apply(pd.Series).melt().values)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.