Konwertowanie tablicy NumPy w strukturę listy Python?

298

Jak przekonwertować tablicę NumPy na listę Pythona (na przykład [[1,2,3],[4,5,6]]) i zrobić to dość szybko?

Alex Brooks
źródło

Odpowiedzi:

426

Użyj tolist():

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

Zauważ, że konwertuje to wartości z dowolnego typu numpy, jaki mogą mieć (np. Np .int32 lub np.float32) na „najbliższy zgodny typ Pythona” (na liście). Jeśli chcesz zachować typy danych numpy, możesz zamiast tego wywołać list () w tablicy, a otrzymasz listę skalar numpy . (Podziękowania dla Mr_and_Mrs_D za wskazanie tego w komentarzu.)

Peter Hansen
źródło
6
Jeśli twoja lista jest float32 tolist, przekonwertuje ją na floatss - prawdopodobnie nie jest to pożądane. Korzystanie list(myarray)nie cierpi z tego powodu - dlaczego powinniśmy preferować tolist?
Mr_and_Mrs_D
1
@Mr_and_Mrs_D sugerujesz, że pomimo posiadania liczb zmiennoprzecinkowych w tablicy, chciałbyś, aby wynikowa lista była liczbami całkowitymi? To całkiem inne pytanie ... i oczywiście trzeba by sprecyzować, że pomimo tego, że są wartościami float32, wszystkie będą integralne. W każdym razie, gdybyś miał taką sytuację, myślę, że zrobienie tego myarray.astype(np.int32).tolist()byłoby opcją i wyraźne na temat tego, co próbujesz osiągnąć. (I na koniec, list(array_of_type_float32)nie podaje liczb całkowitych, kiedy próbowałem ... więc nie wiem, o co pytasz.)
Peter Hansen
1
Nigdy nie wspominałem o liczbach całkowitych - spróbujfloat32_array = np.array([0.51764709], np.float32); print(float32_array.tolist()); print(list(float32_array))
Mr_and_Mrs_D
2
Okej, więc jeden konwertuje na [float], a drugi nadal używa numpy skalarnego typu float32, jako [np.float32]. W porządku. Dobrze wiedzieć, ale myślę, że jest to pożądane, czy nie, zależy od każdego konkretnego przypadku. Podejrzewam, że z tego, co warto, na ogół, gdy ktoś (np. OP) prosi o konwersję na listę, domyślnie oznacza listę zwykłych typów danych w języku Python, w tym przypadku albo liczby zmiennoprzecinkowe, albo liczby całkowite, a nie listę numpy typów skalarnych . Dziękujemy za zwrócenie na to uwagi: zredagowałem odpowiedź, aby zamieścić notatkę na ten temat.
Peter Hansen
Wzdłuż tych linii: np.array([[0, 'one'], ['two', 3]]).tolist() -> [['0', 'one'], ['two', '3']]
keithpjolley
11

Metoda numpy .tolist tworzy listy zagnieżdżone, jeśli tablica numpy ma kształt 2D.

jeśli pożądane są płaskie listy, działa poniższa metoda.

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
źródło
5

tolist()działa dobrze, nawet jeśli napotkał tablicę zagnieżdżoną, powiedzmy pandy 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
źródło
0

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

Ganesh Jadhav
źródło
0

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

list(c.flatten())
Harshal SG
źródło