¿Convertir la matriz NumPy en la estructura de la lista de Python?


298

¿Cómo convierto una matriz NumPy en una lista de Python (por ejemplo [[1,2,3],[4,5,6]]) y lo hago razonablemente rápido?

Respuestas:


427

Uso tolist():

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

Tenga en cuenta que esto convierte los valores de cualquier tipo de numpy que puedan tener (por ejemplo, np.int32 o np.float32) al "tipo de Python compatible más cercano" (en una lista). Si desea preservar los tipos de datos numpy, puede llamar a list () en su matriz en su lugar, y terminará con una lista de escalares numpy . (Gracias a Mr_and_Mrs_D por señalar eso en un comentario).


66
Si su lista es float32 tolist, la convertirá en floatss, probablemente no sea lo que desee. El uso list(myarray)no sufre de esto, ¿por qué deberíamos preferir tolist?
Mr_and_Mrs_D

1
@Mr_and_Mrs_D ¿sugiere que, a pesar de tener flotantes en su matriz, le gustaría que la lista resultante fuera un número entero? Esa es una pregunta completamente diferente ... y, por supuesto, tendría que especificar que a pesar de ser valores float32, todos serán integrales. De todos modos, si tuvieras esa situación, supongo que hacerlo myarray.astype(np.int32).tolist()sería una opción explícita sobre lo que estás tratando de lograr. (Y, por último, list(array_of_type_float32)no da enteros aquí cuando lo intenté ... así que no sé lo que estás preguntando).
Peter Hansen el

1
Nunca mencioné números enteros - intentefloat32_array = np.array([0.51764709], np.float32); print(float32_array.tolist()); print(list(float32_array))
Mr_and_Mrs_D

2
Bien, entonces uno se convierte a [float] y el otro usa el tipo escalar float32 numpy todavía, como [np.float32]. Multa. Es bueno saberlo, pero supongo que si es deseable o no depende de cada caso específico. Por lo que vale, sospecho que, en general, cuando alguien (como el OP) solicita la conversión a una lista, significan implícitamente una lista de tipos de datos de Python regulares, en este caso, flotantes o enteros, y no una lista de tipos escalares numpy . Gracias por señalar esto: he editado la respuesta para incluir una nota al respecto.
Peter Hansen

En ese sentido: np.array([[0, 'one'], ['two', 3]]).tolist() -> [['0', 'one'], ['two', '3']]
keithpjolley

11

El método numpy .tolist produce listas anidadas si la forma de la matriz numpy es 2D.

si se desean listas planas, el siguiente método funciona.

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()funciona bien incluso si encuentra una matriz anidada, digamos pandas 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))


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.