Liste der Listen in numpy Array


182

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.

Antworten:


197

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 eine Reihe 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)

15
Danke, bin hierher gekommen. 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

dtype=floatAuch arbeitet, konvertiert es Nonezu np.nan, die nützlich sein können.

104
>>> numpy.array([[1, 2], [3, 4]]) 
array([[1, 2], [3, 4]])

13
Dadurch wird automatisch eine Liste von Listen in ein 2D-Array konvertiert, da die Länge aller enthaltenen Listen gleich ist. Wissen Sie, wie Sie das nicht tun können: Erstellen Sie ein Listenarray, auch wenn alle Listen dieselbe 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-Map-Zeug)
Juh_

7
Wenn dies bei Ihnen nicht funktioniert, weil Ihre Unterlisten nicht gerade groß sind, lesen Sie die folgende Antwort .
Nikana Reklawyks

@NikanaReklawyks Ich war verwirrt, nachdem ich mir die Antwort angesehen hatte, aber Ihr Kommentar war hilfreich. Ich fand heraus, dass meine Liste von Listen gezackt war, als es nicht sein sollte.
Nikhil Girraj

38

Da dies die häufigste Suche bei Google ist, um eine Liste von Listen in ein Numpy-Array zu konvertieren, 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 daran dachte, es so zu machen, war ich ziemlich zufrieden mit mir selbst, 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 enthält, daher habe ich die hinzugefügt concatenate .

Wie auch immer ... Ich bevorzuge den hstackAnsatz für die elegante Verwendung von Numpy.


12
Während einige Leute danach suchen, bin ich mir ziemlich sicher, dass das OP einen mehrdimensionalen nparr wollte.
Nathan

1
Ich habe danach gesucht :))
Pallie

26

Es ist so einfach wie:

>>> lists = [[1, 2], [3, 4]]
>>> np.array(lists)
array([[1, 2],
       [3, 4]])

6

Nachdem ich nach dem Problem gesucht hatte, verschachtelte Listen mit N Ebenen in ein N-dimensionales Array zu konvertieren, habe ich wieder nichts gefunden.

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 das [...[...[...]]]Teil nicht benötigen, wenn Sie bereits über die Struktur verschachtelter Listen verfügen . Sie müssen nur anrufen np.array, mit ndmin=number-of-list-layers. (obwohl ich in meinem Fall ndmin=number-of-list-layers-minus-1aus irgendeinem Grund eine zusätzliche Ebene erstellt habe - muss untersucht werden)
Venryx

Ah okay, das Problem in meinem Fall ist, dass für die tiefste "Listenebene" die Listen nicht alle die gleiche Länge hatten, was dazu führte np.array, dass diese tiefsten Listen nur "umbrochen" wurden, anstatt sie in numpy Arrays umzuwandeln.
Venryx

-2

Ich hatte eine Liste von Listen gleicher Länge. Sogar dannIgnacio Vazquez-Abrams die Antwort für mich nicht geklappt. Ich habe ein 1-D-Numpy-Array, dessen Elemente Listen sind. Wenn Sie mit demselben Problem konfrontiert waren, können Sie die folgende Methode verwenden

Verwenden 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 um alles in der Welt würden Sie weiter stapeln, wenn Sie wissen, dass Sie 10 Listen haben, warum nicht np.empty ((10, 4)) und es dann einfach auffüllen?
Mehdi

-4

Benutze einfach Pandas

list(pd.DataFrame(listofstuff).melt().values)

Dies funktioniert nur für eine Liste von Listen

Wenn Sie eine Liste mit Listen haben, möchten Sie vielleicht etwas in der Art von ausprobieren

lists(pd.DataFrame(listofstuff).melt().apply(pd.Series).melt().values)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.