Ich bin kürzlich zu Python 3.5 gewechselt und habe festgestellt, dass sich der neue Matrixmultiplikationsoperator (@) manchmal anders verhält als der Numpy-Punkt- Operator. Beispiel für 3D-Arrays:
import numpy as np
a = np.random.rand(8,13,13)
b = np.random.rand(8,13,13)
c = a @ b # Python 3.5+
d = np.dot(a, b)
Der @
Operator gibt ein Array von Formen zurück:
c.shape
(8, 13, 13)
während die np.dot()
Funktion zurückgibt:
d.shape
(8, 13, 8, 13)
Wie kann ich das gleiche Ergebnis mit numpy dot reproduzieren? Gibt es noch andere signifikante Unterschiede?
matmul
Funktion vor Jahren nicht implementiert ?@
als Infix-Operator ist neu, aber die Funktion funktioniert auch ohne.Antworten:
Der
@
Operator ruft die__matmul__
Methode des Arrays nicht aufdot
. Diese Methode ist auch in der API als Funktion vorhandennp.matmul
.Aus der Dokumentation:
Der letzte Punkt macht deutlich, dass sich
dot
undmatmul
Methoden anders verhalten, wenn 3D-Arrays (oder höherdimensionale Arrays) übergeben werden. Aus der Dokumentation noch etwas zitieren:Für
matmul
:Für
np.dot
:quelle
Die Antwort von @ajcr erklärt, wie sich die
dot
undmatmul
(durch das@
Symbol aufgerufen ) unterscheiden. Wenn man sich ein einfaches Beispiel ansieht, sieht man deutlich, wie sich die beiden unterschiedlich verhalten, wenn man mit „Matrizenstapeln“ oder Tensoren arbeitet.Um die Unterschiede zu verdeutlichen, nehmen Sie ein 4x4-Array und geben Sie das
dot
Produkt und dasmatmul
Produkt mit einem 3x4x2-Stapel Matrizen oder Tensor zurück.Die Produkte jeder Operation werden unten angezeigt. Beachten Sie, wie das Punktprodukt ist,
und wie das Matrixprodukt durch gemeinsames Senden der Matrix gebildet wird.
quelle
a = np.arange(24).reshape(3, 4, 2)
erstellen, besteht darin, ein Array mit den Abmessungen 3x4x2 zu erstellen.Nur zu
@
Ihrer Information , und seine numpy Äquivalentedot
undmatmul
sind alle ungefähr gleich schnell. (Handlung erstellt mit perfplot , einem Projekt von mir.)Code zur Reproduktion der Handlung:
quelle
In der Mathematik halte ich den Punkt in numpy für sinnvoller
da es das Punktprodukt gibt, wenn a und b Vektoren sind, oder die Matrixmultiplikation, wenn a und b Matrizen sind
Wie für matmul Betrieb in numpy, es besteht aus Teilen des Punktergebnis, und es kann als definiert werden ,
> matmul (a, b) _ {i, j, k, c} =
Sie sehen also, dass matmul (a, b) ein Array mit einer kleinen Form zurückgibt, das einen geringeren Speicherverbrauch aufweist und in Anwendungen sinnvoller ist. Insbesondere in Kombination mit Rundfunk können Sie erhalten
beispielsweise.
Anhand der beiden obigen Definitionen können Sie die Anforderungen für die Verwendung dieser beiden Operationen erkennen. Angenommen, a.shape = (s1, s2, s3, s4) und b.shape = (t1, t2, t3, t4)
Um Punkt (a, b) zu verwenden , benötigen Sie
Um matmul (a, b) zu verwenden , benötigen Sie
Verwenden Sie den folgenden Code, um sich selbst zu überzeugen.
Codebeispiel
quelle
np.matmul
gibt auch das Punktprodukt auf Vektoren und das Matrixprodukt auf Matrizen an.Hier ist ein Vergleich mit, um
np.einsum
zu zeigen, wie die Indizes projiziert werdenquelle
Meine Erfahrung mit MATMUL und DOT
Beim Versuch, MATMUL zu verwenden, wurde ständig "ValueError: Die Form der übergebenen Werte ist (200, 1), Indizes implizieren (200, 3)" angezeigt. Ich wollte eine schnelle Problemumgehung und fand, dass DOT dieselbe Funktionalität bietet. Ich bekomme keine Fehler mit DOT. Ich bekomme die richtige Antwort
mit MATMUL
mit DOT
quelle