Convertendo a matriz NumPy na estrutura da lista Python?

298

Como converter uma matriz NumPy em uma lista Python (por exemplo [[1,2,3],[4,5,6]]) e fazê-lo razoavelmente rápido?

Alex Brooks
fonte

Respostas:

427

Use tolist():

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

Observe que isso converte os valores de qualquer tipo numpy que eles possam ter (por exemplo, np.int32 ou np.float32) no "tipo Python compatível mais próximo" (em uma lista). Se você deseja preservar os tipos de dados numpy, pode chamar list () em sua matriz e você terminará com uma lista de escalares numpy . (Obrigado a Mr_and_Mrs_D por apontar isso em um comentário.)

Peter Hansen
fonte
6
Se sua lista for float32 tolist, ela será convertida em floatss - isso provavelmente não é desejado. O uso list(myarray)não sofre com isso - por que devemos preferir tolist?
Mr_and_Mrs_D
1
@Mr_and_Mrs_D você está sugerindo que, apesar de ter flutuadores em sua matriz, gostaria que a lista resultante fosse inteira? Essa é uma pergunta totalmente diferente ... e, é claro, você teria que especificar que, apesar de serem valores float32, todos serão integrados. De qualquer forma, se você tivesse essa situação, acho que fazer myarray.astype(np.int32).tolist()seria uma opção e explícita sobre o que você está tentando realizar. (E, por último, list(array_of_type_float32)não dá inteiros aqui quando eu tentei ... então eu não sei o que você está pedindo.)
Peter Hansen
1
Eu nunca mencionei números inteiros - tentefloat32_array = np.array([0.51764709], np.float32); print(float32_array.tolist()); print(list(float32_array))
Mr_and_Mrs_D 4/17/17
2
Ok, então um converte para [float] e o outro usa o tipo float32 escalar numpy ainda, como [np.float32]. Bem. É bom saber, mas acho que se é desejável ou não depende de cada caso específico. Pelo que vale, suspeito que, geralmente, quando alguém (como o OP) solicita a conversão para uma lista, significa implicitamente uma lista de tipos regulares de dados Python, nesse caso, flutuadores ou números inteiros, e não uma lista de tipos escalares numpy . Obrigado por apontar isso: editei a resposta para incluir uma observação sobre isso.
31517 Peter
Nessa linha: np.array([[0, 'one'], ['two', 3]]).tolist() -> [['0', 'one'], ['two', '3']]
keithpjolley 20/03/19
11

O método numpy .tolist produz listas aninhadas se a forma da matriz numpy for 2D.

se desejar listas planas, o método abaixo 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`
aspiringGuru
fonte
5

tolist()funciona bem mesmo se encontrar uma matriz aninhada, digamos um 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))
Shivid
fonte
0

someList = [list(map(int, input().split())) for i in range(N)]

Ganesh Jadhav
fonte
0

c = matriz np ([[1,2,3], [4,5,6]])

list(c.flatten())
Harshal SG
fonte