Conversione dell'array NumPy nella struttura dell'elenco Python?


298

Come faccio a convertire un array NumPy in un Elenco Python (ad esempio [[1,2,3],[4,5,6]]) e farlo in modo ragionevolmente veloce?

Risposte:


427

Utilizzare tolist():

import numpy as np
>>> np.array([[1,2,3],[4,5,6]]).tolist()
[[1, 2, 3], [4, 5, 6]]

Si noti che ciò converte i valori di qualunque tipo intorpidito che possono avere (ad esempio np.int32 o np.float32) nel "tipo Python compatibile più vicino" (in un elenco). Se si desidera preservare i tipi di dati numpy, è possibile chiamare list () sull'array e si otterrà un elenco di scalari numpy . (Grazie a Mr_and_Mrs_D per averlo sottolineato in un commento.)


6
Se la tua lista è float32 tolist, la convertirà in floatss - probabilmente non è desiderato. L'uso list(myarray)non ne risente: perché dovremmo preferire tolist?
Mr_and_Mrs_D,

1
@Mr_and_Mrs_D stai suggerendo che, pur avendo float nel tuo array, vorresti che l'elenco risultante fosse un numero intero? È una domanda completamente diversa ... e ovviamente dovresti specificare che nonostante siano valori float32, saranno tutti integrali. Ad ogni modo, se tu avessi quella situazione, immagino che fare myarray.astype(np.int32).tolist()sarebbe un'opzione ed esplicito su ciò che stai cercando di realizzare. (E, infine, list(array_of_type_float32)non fornisce numeri interi qui quando l'ho provato ... quindi non so cosa mi stai chiedendo.)
Peter Hansen,

1
Non ho mai menzionato numeri interi - provafloat32_array = np.array([0.51764709], np.float32); print(float32_array.tolist()); print(list(float32_array))
Mr_and_Mrs_D il

2
Ok, quindi l'uno si converte in [float] e l'altro usa ancora il tipo float32 scalare numpy, come [np.float32]. Belle. Buono a sapersi, ma immagino che sia desiderabile o meno dipende da ciascun caso specifico. Per quello che vale, sospetto che generalmente quando qualcuno (come l'OP) chiede la conversione in un elenco, implicitamente significano un elenco di tipi di dati Python regolari, in questo caso float o numeri interi, e non un elenco di tipi scalari numpy . Grazie per averlo sottolineato: ho modificato la risposta per includere una nota al riguardo.
Peter Hansen,

In tal senso: np.array([[0, 'one'], ['two', 3]]).tolist() -> [['0', 'one'], ['two', '3']]
keithpjolley

11

Il metodo numty .tolist produce elenchi nidificati se la forma dell'array numpy è 2D.

se si desiderano elenchi flat, il metodo seguente funziona.

import numpy as np
from itertools import chain

a = [1,2,3,4,5,6,7,8,9]
print type(a), len(a), a
npa = np.asarray(a)
print type(npa), npa.shape, "\n", npa
npa = npa.reshape((3, 3))
print type(npa), npa.shape, "\n", npa
a = list(chain.from_iterable(npa))
print type(a), len(a), a`

5

tolist()funziona bene anche se si incontra un array nidificato, diciamo un panda DataFrame;

my_list = [0,1,2,3,4,5,4,3,2,1,0]
my_dt = pd.DataFrame(my_list)
new_list = [i[0] for i in my_dt.values.tolist()]

print(type(my_list),type(my_dt),type(new_list))


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.