Wie konvertiere ich eine einfache Liste von Listen in ein numpy-Array? Die Zeilen sind einzelne Unterlisten und jede Zeile enthält die Elemente in der Unterliste.
Liste von Listen in numpy-Array
Richa Sachdev
Bastian
Wenn Ihre Listenliste Listen mit unterschiedlicher Anzahl von Elementen enthält, funktioniert die Antwort von Ignacio Vazquez-Abrams nicht. Stattdessen gibt es mindestens 3 Optionen:
1) Erstellen Sie ein Array von Arrays:
x=[[1,2],[1,2,3],[1]]
y=numpy.array([numpy.array(xi) for xi in x])
type(y)
>>><type 'numpy.ndarray'>
type(y[0])
>>><type 'numpy.ndarray'>
2) Erstellen Sie ein Array von Listen:
x=[[1,2],[1,2,3],[1]]
y=numpy.array(x)
type(y)
>>><type 'numpy.ndarray'>
type(y[0])
>>><type 'list'>
3) Machen Sie zuerst die Listen gleich lang:
x=[[1,2],[1,2,3],[1]]
length = max(map(len, x))
y=numpy.array([xi+[None]*(length-len(xi)) for xi in x])
y
>>>array([[1, 2, None],
>>> [1, 2, 3],
>>> [1, None, None]], dtype=object)
-
Danke, bin dafür hergekommen. Ich benutze numpy schon eine Weile und fand dieses Verhalten nicht trivial. Vielen Dank, dass Sie sich die Zeit genommen haben, diesen allgemeineren Fall zu erklären.
– Adam Hughes
29. Oktober 14 um 0:07 Uhr
-
dtype=float
funktioniert auch, es wird konvertierenNone
zunp.nan
was nützlich sein kann.– Benutzer13517564
22. Mai 20 um 12:08 Uhr
-
Auf Python 3.9 musste ich verwenden
(np.vectorize(len)(x)).max()
anstattmax(map(len, x))
auf der dritten Lösung– Begoodpy
3. Juni 21 um 6:46 Uhr
-
Und Sie erhalten eine Warnung:
VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray return array(a, dtype, copy=False, order=order)
– Begoodpy
3. Juni 21 um 6:47 Uhr
Ignacio Vazquez-Abrams
>>> numpy.array([[1, 2], [3, 4]])
array([[1, 2], [3, 4]])
-
Dadurch wird eine Liste von Listen automatisch in ein 2D-Array konvertiert, da die Länge aller enthaltenen Listen gleich ist. Wissen Sie, wie man das nicht macht: ein Array von Listen erstellen, auch wenn alle Listen die gleiche Länge haben? Oder ist es möglich, ein 2D-Array in ein 1D-Array eines 1D-Arrays zu konvertieren (effizient meine ich, keine iterative Methode oder Python-Kartenmaterial)
– Juh_
4. Oktober 12 um 9:58 Uhr
-
Wenn das bei Ihnen nicht funktioniert, weil Ihre Unterlisten nicht gleichmäßig groß sind, sehen Sie sich die folgende Antwort an.
– Nikana Reklawyks
17. Oktober 16 um 5:27 Uhr
-
@NikanaReklawyks Ich war verwirrt, nachdem ich mir die Antwort angesehen hatte, aber Ihr Kommentar war hilfreich. Ich fand heraus, dass meine Liste mit Listen gezackt war, obwohl es nicht sein sollte.
– Nikhil Girraj
21. Dezember 19 um 5:25 Uhr
-
Wie schnell ist das in Bezug auf die Länge des Streits? Ich sehe keine gute Antwort in der Dokumentation?
– Zarking
5. August 2020 um 0:54 Uhr
2cynykyl
Da dies die Top-Suche bei Google zum Konvertieren einer Liste von Listen in ein Numpy-Array ist, biete ich Folgendes an, obwohl die Frage 4 Jahre alt ist:
>>> x = [[1, 2], [1, 2, 3], [1]]
>>> y = numpy.hstack(x)
>>> print(y)
[1 2 1 2 3 1]
Als ich zum ersten Mal daran dachte, es so zu machen, war ich ziemlich zufrieden mit mir, weil es soooo einfach ist. Nach dem Timing mit einer größeren Liste von Listen ist dies jedoch tatsächlich schneller:
>>> y = numpy.concatenate([numpy.array(i) for i in x])
>>> print(y)
[1 2 1 2 3 1]
Beachten Sie, dass @ Bastiaans Antwort Nr. 1 keine einzige fortlaufende Liste erstellt, daher habe ich die hinzugefügt concatenate
.
Wie auch immer … ich bevorzuge die hstack
Ansatz für die elegante Verwendung von Numpy.
-
Während einige Leute danach suchen, bin ich mir ziemlich sicher, dass das OP einen mehrdimensionalen nparr wollte.
– Nathan
8. Juni 18 um 19:18 Uhr
Es ist so einfach wie:
>>> lists = [[1, 2], [3, 4]]
>>> np.array(lists)
array([[1, 2],
[3, 4]])
gepanzerter Elch
Auch hier habe ich nach der Suche nach dem Problem, verschachtelte Listen mit N Ebenen in ein N-dimensionales Array zu konvertieren, nichts gefunden, also hier mein Weg:
import numpy as np
new_array=np.array([[[coord for coord in xk] for xk in xj] for xj in xi], ndmin=3) #this case for N=3
-
Beachten Sie, dass Sie die verschachtelte Listenstruktur nicht benötigen, wenn Sie bereits über diese verfügen
[...[...[...]]]
Teil. Sie brauchen nur anzurufennp.array
mitndmin=number-of-list-layers
. (obwohl ich in meinem Fall benötigtendmin=number-of-list-layers-minus-1
aus irgendeinem Grund, sonst eine zusätzliche Ebene erstellt – muss untersucht werden)– Venryx
19. Mai 20 um 3:50 Uhr
-
Ah okay, das Problem in meinem Fall ist, dass für die tiefste “Listenschicht” die Listen nicht alle die gleiche Länge hatten, was verursachte
np.array
um diese tiefsten Listen einfach zu “verpacken”, anstatt sie in numpy-Arrays umzuwandeln.– Venryx
19. Mai 20 um 4:34 Uhr
-
xi = [[[3, 4], [3, 4]], [[3, 4], [3, 4]]]
gibtarray([[[3, 4], [3, 4]], [[3, 4], [3, 4]]])
. Ich sehe hier nur das Array an der äußeren Schicht. Ich dachte, die Frage ist, alles in ein numpy-Array zu konvertieren? Oder habe ich ein falsches Beispiel gewählt?– Frage an42
2. Juni 21 um 18:53 Uhr
seralouk
Das OP gab an, dass “die Zeilen einzelne Unterlisten sind und jede Zeile die Elemente in der Unterliste enthält”.
Unter der Annahme, dass die Verwendung von numpy
ist nicht verboten (da das Flair numpy im OP hinzugefügt wurde), die Verwendung vstack
:
import numpy as np
list_of_lists= [[1, 2, 3], [4, 5, 6], [7 ,8, 9]]
array = np.vstack(list_of_lists)
# array([[1, 2, 3],
# [4, 5, 6],
# [7, 8, 9]])
oder einfacher (wie in einer anderen Antwort erwähnt),
array = np.array(list_of_lists)
-
Beachten Sie, dass Sie die verschachtelte Listenstruktur nicht benötigen, wenn Sie bereits über diese verfügen
[...[...[...]]]
Teil. Sie brauchen nur anzurufennp.array
mitndmin=number-of-list-layers
. (obwohl ich in meinem Fall benötigtendmin=number-of-list-layers-minus-1
aus irgendeinem Grund, sonst eine zusätzliche Ebene erstellt – muss untersucht werden)– Venryx
19. Mai 20 um 3:50 Uhr
-
Ah okay, das Problem in meinem Fall ist, dass für die tiefste “Listenschicht” die Listen nicht alle die gleiche Länge hatten, was verursachte
np.array
um diese tiefsten Listen einfach zu “verpacken”, anstatt sie in numpy-Arrays umzuwandeln.– Venryx
19. Mai 20 um 4:34 Uhr
-
xi = [[[3, 4], [3, 4]], [[3, 4], [3, 4]]]
gibtarray([[[3, 4], [3, 4]], [[3, 4], [3, 4]]])
. Ich sehe hier nur das Array an der äußeren Schicht. Ich dachte, die Frage ist, alles in ein numpy-Array zu konvertieren? Oder habe ich ein falsches Beispiel gewählt?– Frage an42
2. Juni 21 um 18:53 Uhr
Nagabhushan SN
Ich hatte eine Liste gleich langer Listen. Sogar dann Ignacio Vazquez-Abrams
‘s Antwort hat bei mir nicht funktioniert. Ich habe ein 1-D-numpy-Array, dessen Elemente Listen sind. Wenn Sie auf dasselbe Problem gestoßen sind, können Sie die folgende Methode verwenden
Benutzen numpy.vstack
import numpy as np
np_array = np.empty((0,4), dtype="float")
for i in range(10)
row_data = ... # get row_data as list
np_array = np.vstack((np_array, np.array(row_data)))
-
warum in aller Welt würden Sie weiter stapeln, wenn Sie wissen, dass Sie 10 Listen haben, warum nicht np.empty((10, 4)) und dann einfach auffüllen?
– Medi
20. August 19 um 7:32 Uhr
.