Angenommen, ich habe;
LIST = [[array([1, 2, 3, 4, 5]), array([1, 2, 3, 4, 5],[1,2,3,4,5])] # inner lists are numpy arrays
Ich versuche zu konvertieren;
array([[1, 2, 3, 4, 5],
[1, 2, 3, 4, 5],
[1, 2, 3, 4, 5])
Ich löse es gerade durch Iteration auf vstack, aber es ist sehr langsam für besonders große LIST
Was schlagen Sie für den effizientesten Weg vor?
LIST = [[array([1, 2, 3, 4, 5]), array([1, 2, 3, 4, 5],[1,2,3,4,5])]
Dies ist keine korrekte Python-Syntax. Bitte klären Sie.Antworten:
Im Allgemeinen können Sie eine ganze Folge von Arrays entlang einer beliebigen Achse verketten:
aber Sie tun müssen , um Sorgen über die Form und Dimensionalität jeder Anordnung in der Liste (für einen 2-dimensionalen 3x5 - Ausgang, müssen Sie sicherstellen , dass sie alle sind 2-dimensionaler n-by-5 - Arrays bereits). Wenn Sie eindimensionale Arrays als Zeilen einer zweidimensionalen Ausgabe verketten möchten, müssen Sie deren Dimensionalität erweitern.
Wie Jorges Antwort zeigt, gibt es auch die Funktion
stack
, die in Numpy 1.10 eingeführt wurde:Dies erfolgt nach dem komplementären Ansatz: Es wird eine neue Ansicht jedes Eingabearrays erstellt und vor dem Verketten eine zusätzliche Dimension
n
hinzugefügt (in diesem Fall links, sodass jedes Element-1D-Array zu einem 1-mal-n
2D-Array wird). Dies funktioniert nur, wenn alle Eingabearrays dieselbe Form haben - auch entlang der Verkettungsachse.vstack
(oder gleichwertigrow_stack
) ist häufig eine benutzerfreundlichere Lösung, da eine Folge von 1- und / oder 2-dimensionalen Arrays verwendet wird und die Dimensionalität bei Bedarf und nur bei Bedarf automatisch erweitert wird, bevor die gesamte Liste zusammengefügt wird. Wenn eine neue Dimension erforderlich ist, wird sie links hinzugefügt. Auch hier können Sie eine ganze Liste auf einmal verketten, ohne sie wiederholen zu müssen:Dieses flexible Verhalten zeigt auch die syntaktische Verknüpfung
numpy.r_[ array1, ...., arrayN ]
(beachten Sie die eckigen Klammern). Dies ist gut für die Verkettung einiger explizit benannter Arrays, aber nicht gut für Ihre Situation, da diese Syntax keine Folge von Arrays wie Ihre akzeptiertLIST
.Es gibt auch eine analoge Funktion
column_stack
und Verknüpfungc_[...]
für das horizontale (spaltenweise) Stapeln sowie eine fast analoge Funktion -hstack
obwohl letztere aus irgendeinem Grund weniger flexibel ist (sie ist strenger in Bezug auf die Dimensionalität der Eingabearrays und versucht zu verketten 1-D-Arrays Ende-zu-Ende, anstatt sie als Spalten zu behandeln).Schließlich funktioniert im speziellen Fall des vertikalen Stapelns von 1-D-Arrays auch Folgendes:
... weil Arrays aus einer Folge anderer Arrays erstellt werden können und dem Anfang eine neue Dimension hinzugefügt wird.
quelle
Ab NumPy Version 1.10 haben wir die Methode Stapel . Es kann Arrays jeder Dimension stapeln (alle gleich):
Genießen,
quelle
Ich habe einige Methoden auf Geschwindigkeitsleistung überprüft und festgestellt, dass es keinen Unterschied gibt! Der einzige Unterschied besteht darin, dass Sie mit einigen Methoden die Dimension sorgfältig prüfen müssen.
Zeitliche Koordinierung:
Wie Sie sehen können, habe ich zwei Experimente versucht - mit
np.random.rand(10000)
undnp.random.rand(1, 10000)
Und wenn wir 2D-Arrays als verwendennp.stack
undnp.array
eine zusätzliche Dimension erstellen - result.shape ist (1.10000.10000) und (10000, 1.10000), daher benötigen sie zusätzliche Aktionen, um dies zu vermeiden .Code:
quelle