HOWTO · NumPy
Ein 1D-Array in NumPy transponieren
Erfahren Sie, wie Sie ein 1D NumPy-Array in Python transponieren
Auf dieser Seite
Das Transponieren eines 1D-Arrays in NumPy führt häufig zu Verwirrung: Das Anwenden von .T auf einen eindimensionalen ndarray läuft ohne Fehlermeldung, doch das Array sieht anschließend genau wie zuvor aus. Um eine echte Transposition zu erhalten, wandeln Sie das 1D-Array zuerst in einen zweidimensionalen Zeilen- oder Spaltenvektor um und transponieren diesen. Dieser Artikel erklärt, warum .T ein 1D-Array unverändert lässt, und zeigt die üblichen Möglichkeiten, die zweite Achse hinzuzufügen.
Warum .T ein 1D-Array unverändert lässt
Ein 1D-ndarray hat die Form (n,): eine einzelne Achse, die n Elemente enthält. Beim Transponieren wird die Reihenfolge der Achsen eines Arrays vertauscht. Bei nur einer Achse gibt es nichts zu vertauschen, sodass .T dieselben Daten mit derselben Form zurückgibt. Prüfen Sie die Form vor und nach der Operation:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
import numpy as np
a = np.array([1, 2, 3, 4, 5])
print(a.shape)
print(a.T.shape)
print(a.T)
Ausgabe:
(5,)
(5,)
[1 2 3 4 5]
Die Form (5,) und die Werte sind nach .T identisch. Deshalb wird oft gesagt, ein 1D-Array lasse sich nicht transponieren. Genauer ist: Die Transposition wird ausgeführt, ist aber eine Nulloperation – NumPy gibt eine Sicht (View) auf dieselben eindimensionalen Daten zurück.
Beachten Sie, dass .T ein ndarray-Attribut und keine allgemeine Python-Funktion ist. Eine einfache list besitzt kein .T; konvertieren Sie Listendaten daher mit np.array() oder np.asarray(), bevor Sie eines dieser Verfahren anwenden.
Zeilen- oder Spaltenvektor erstellen
Die praktische Lösung besteht darin, dem Array eine zweite Achse zu geben. Ein Zeilenvektor hat die Form (1, n), ein Spaltenvektor die Form (n, 1), und beide lassen sich wie erwartet transponieren. Die Methode reshape erzeugt einen Zeilenvektor folgendermaßen:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
import numpy as np
a = np.array([1, 2, 3, 4, 5])
row = a.reshape(1, -1)
print(row.shape)
print(row)
Ausgabe:
(1, 5)
[[1 2 3 4 5]]
Die 1 legt die Anzahl der Zeilen fest; das -1 weist NumPy an, die Spaltenanzahl so zu berechnen, dass alle fünf Elemente hineinpassen. Dieselbe Zeile ergibt sich aus a[np.newaxis, :]; dieser Ausdruck fügt beim Indizieren am Anfang eine neue Achse ein.
Für einen Spaltenvektor vertauschen Sie die Argumente:
import numpy as np
a = np.array([1, 2, 3, 4, 5])
col = a.reshape(-1, 1)
print(col.shape)
print(col)
Ausgabe:
(5, 1)
[[1]
[2]
[3]
[4]
[5]]
Die entsprechende np.newaxis-Form ist a[:, np.newaxis]; sie belässt die vorhandene Achse an ihrer Position und hängt eine neue Achse der Länge 1 an. Beachten Sie die doppelten Klammern in der ausgegebenen Darstellung: Sie kennzeichnen ein 2D-Array, im Gegensatz zu den einfachen Klammern eines 1D-Arrays.
reshape und np.newaxis vergleichen
Beide Werkzeuge fügen eine Achse hinzu, ohne die Daten zu kopieren. Die Wahl ist daher eher eine Frage der Lesbarkeit als der Leistung. Die folgenden Paare sind äquivalent:
a.reshape(1, -1)erzeugt denselben Zeilenvektor wiea[np.newaxis, :].a.reshape(-1, 1)erzeugt denselben Spaltenvektor wiea[:, np.newaxis].
Verwenden Sie reshape, wenn die Zielform der eigentliche Zweck des Aufrufs ist: Die Methode gibt die gewünschten Dimensionen explizit an und kann mehrere Achsen in einem Schritt neu anordnen. Verwenden Sie np.newaxis innerhalb eines Indexausdrucks, wenn Sie ohnehin einen Slice erstellen oder die Achseneinfügung genau an der Stelle sichtbar machen möchten, an der sie erfolgt. Da np.newaxis ein Alias für None ist, funktioniert a[None, :] identisch. Sie können überprüfen, dass die Paare identische Ergebnisse liefern:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
import numpy as np
a = np.array([1, 2, 3, 4, 5])
print(np.array_equal(a.reshape(1, -1), a[np.newaxis, :]))
print(np.array_equal(a.reshape(-1, 1), a[:, np.newaxis]))
Ausgabe:
True
True
Formen und Ausgaben überprüfen
Sobald das Array zweidimensional ist, bewirkt .T, was die meisten Leser eigentlich erwarten: Es wandelt einen Zeilenvektor in einen Spaltenvektor um und einen Spaltenvektor wieder in einen Zeilenvektor. Führen Sie diese vollständige Prüfung aus und vergleichen Sie die ausgegebenen Formen mit den dargestellten Werten. Das unveränderte Beispiel gibt die Formen und den Spaltenvektor aus; die angezeigten Bezeichnungen bleiben auf Englisch:
import numpy as np
a = np.array([1, 2, 3, 4, 5])
row = a[np.newaxis, :]
col = row.T
print("a:", a.shape)
print("row:", row.shape)
print("row.T:", col.shape)
print(col)
Ausgabe:
a: (5,)
row: (1, 5)
row.T: (5, 1)
[[1]
[2]
[3]
[4]
[5]]
Die Werte bleiben unverändert; nur die Reihenfolge der Achsen unterscheidet sich. Verwenden Sie .shape (oder .ndim), wenn Sie unsicher sind, mit welchem Objekt Sie arbeiten: Die Ausgabe (5,) bedeutet, dass das Array weiterhin eindimensional ist und .T es unverändert lässt, während die Ausgabe (1, 5) oder (5, 1) einen 2D-Vektor anzeigt, dessen Transposition die Achsen vertauscht. Diese Unterscheidung ist für nachgelagerte Aufgaben wie Matrixmultiplikation und die Vorbereitung von Modelleingaben wichtig, die zweidimensionale Eingaben erwarten.