Gegeben sind drei numpige Arrays: ein multidimensionales Array x
, ein Vektor y
mit einer abschließenden Singleton-Dimension und ein Vektor z
ohne abschließende Singleton-Dimension,
Das Verhalten von Broadcast-Operationen ändert sich je nach Vektordarstellung und Kontext:
%Vor%Mir ist klar, dass ich Folgendes tun kann:
%Vor% aber ich verstehe nicht, was diese explizite Notation mir kauft. Es kauft sicherlich Lesbarkeit nicht. Ich verstehe nicht, warum der Ausdruck x - y
OK ist, aber x - z
ist mehrdeutig.
Warum behandelt Numpy Vektoren mit oder ohne Singleton-Folgen anders?
edit: Die Dokumentation besagt, dass zwei Dimensionen kompatibel sind, wenn Sie sind gleich, oder einer von ihnen ist 1 , aber y
und z
sind beide funktional M x 1
Vektoren, da ein M x 0
Vektor keine Elemente enthält.
Die Konvention sieht vor, dass Broadcasting Singleton-Dimensionen am Anfang der Form eines Arrays einfügt. Dies erleichtert die Ausführung von Operationen über die letzten Dimensionen eines Arrays, sodass (x.T - z).T
funktionieren sollte.
Wenn automatisch entschieden würde, welche Achse von x
mit z
übereinstimmt, würde ein Vorgang wie x - z
genau dann zu einem Fehler führen, wenn N == M
den Code schwieriger zu testen macht. So erlaubt die Konvention einige Bequemlichkeit, während sie gegenüber einem Fehler robust ist.
Wenn Ihnen die Kurzschrift z[:, None]
nicht gefällt, finden Sie vielleicht z[:, np.newaxis]
clearer.
Damit eine Zuweisung wie x[:,0] = y
funktioniert, können Sie stattdessen x[:,0:1] = y
verwenden.
Die Verwendung der Numpy matrix -Schnittstelle im Gegensatz zur Array-Schnittstelle ergibt die gewünschte Broadcasting-Verhalten :
%Vor% Ein Vorteil bei der Behandlung von (M,1)
und (M,)
besteht darin, dass Sie angeben können, welche Dimensionen ausgerichtet und welche Dimensionen gesendet werden sollen
Sagen Sie, Sie haben:
%Vor% Wenn Sie c = a + b
ausführen, werden a
und b
in axis=1
ausgerichtet und a
werden zusammen mit axis=0
:
Aber was, wenn Sie a
und b
in axis=0
ausrichten und in axis=1
ausstrahlen möchten?
(M,1)
vs (M,)
difference können Sie angeben, welche Dimension ausgerichtet und gesendet werden soll.
(Wenn also (M,1)
und (M,)
gleich behandelt werden, wie wird numpy mitgeteilt, das auf axis=1
gesendet werden soll?)