NumPy-Array in Python-Listenstruktur konvertieren?

298

Wie konvertiere ich ein NumPy- Array in eine Python-Liste (zum Beispiel [[1,2,3],[4,5,6]]) und mache es relativ schnell?

Alex Brooks
quelle

Antworten:

427

Verwendung tolist():

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

Beachten Sie, dass dadurch die Werte von einem beliebigen Numpy-Typ (z. B. np.int32 oder np.float32) in den "nächstgelegenen kompatiblen Python-Typ" (in einer Liste) konvertiert werden. Wenn Sie die numpy-Datentypen beibehalten möchten, können Sie stattdessen list () in Ihrem Array aufrufen und erhalten eine Liste mit numpy-Skalaren . (Vielen Dank an Mr_and_Mrs_D für den Hinweis in einem Kommentar.)

Peter Hansen
quelle
6
Wenn Ihre Liste float32 ist, tolistwird sie in floatss konvertiert - das ist wahrscheinlich nicht erwünscht. Die Verwendung list(myarray)leidet nicht darunter - warum sollten wir es vorziehen tolist?
Mr_and_Mrs_D
1
@Mr_and_Mrs_D Schlagen Sie vor, dass die resultierende Liste trotz Floats in Ihrem Array Ganzzahlen sein soll? Das ist eine ganz andere Frage ... und natürlich müssten Sie angeben, dass sie trotz der float32-Werte alle ganzheitlich sind. Wenn Sie diese Situation hätten, myarray.astype(np.int32).tolist()wäre es wahrscheinlich eine Option und explizit, was Sie erreichen möchten. (Und schließlich gibt list(array_of_type_float32)hier keine ganzen Zahlen an, als ich es versuchte ... also weiß ich nicht, was Sie fragen.)
Peter Hansen
1
Ich habe nie ganze Zahlen erwähnt - versuchen Siefloat32_array = np.array([0.51764709], np.float32); print(float32_array.tolist()); print(list(float32_array))
Mr_and_Mrs_D
2
Okay, der eine konvertiert in [float] und der andere verwendet immer noch den numpy-skalaren float32-Typ als [np.float32]. Fein. Gut zu wissen, aber ich denke, ob es wünschenswert ist oder nicht, hängt von jedem Einzelfall ab. Ich vermute, dass jemand (wie das OP), der nach einer Konvertierung in eine Liste fragt, implizit eine Liste regulärer Python-Datentypen meint, in diesem Fall entweder Gleitkommazahlen oder Ganzzahlen, und keine Liste numpy-Skalartypen . Vielen Dank für den Hinweis: Ich habe die Antwort so bearbeitet, dass sie einen Hinweis dazu enthält.
Peter Hansen
In diesem Sinne: np.array([[0, 'one'], ['two', 3]]).tolist() -> [['0', 'one'], ['two', '3']]
Keithpjolley
11

Die numpy .tolist-Methode erzeugt verschachtelte Listen, wenn die numpy-Array-Form 2D ist.

Wenn flache Listen gewünscht werden, funktioniert die folgende Methode.

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`
aufstrebender Guru
quelle
5

tolist()funktioniert auch dann einwandfrei, wenn ein verschachteltes Array angetroffen wird, z. B. ein 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))
Shivid
quelle
0

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

Ganesh Jadhav
quelle
0

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

list(c.flatten())
Harshal SG
quelle