Numpy sendet in Scheiben geschnittene Arrays und Vektoren

9

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,

%Vor%

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.

    
hbristow 05.03.2014, 02:13
quelle

3 Antworten

4

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.

    
joeln 05.03.2014, 02:41
quelle
0

Die Verwendung der Numpy matrix -Schnittstelle im Gegensatz zur Array-Schnittstelle ergibt die gewünschte Broadcasting-Verhalten :

%Vor%     
hbristow 05.03.2014 04:52
quelle
0

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 :

gesendet %Vor%

Aber was, wenn Sie a und b in axis=0 ausrichten und in axis=1 ausstrahlen möchten?

%Vor% Mit

(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?)

    
aha 27.03.2014 17:36
quelle

Tags und Links