In den Numpy-Dokumenten wird empfohlen, für die Arbeit mit Matrizen ein Array anstelle einer Matrix zu verwenden. Im Gegensatz zur Oktave (die ich bis vor kurzem verwendet habe) führt * jedoch keine Matrixmultiplikation durch, sondern Sie müssen die Funktion matrixmultipy () verwenden. Ich denke, das macht den Code sehr unlesbar.
Teilt jemand meine Ansichten und hat eine Lösung gefunden?
.*
vs '*' - Syntax für die elementweise vs Matrix-Multiplikation hat. Wenn es das hätte, wäre alles einfacher, obwohl ich überrascht bin, dass sie sich*
für elementweise und nicht für Matrixmultiplikation entscheiden.Antworten:
Der Hauptgrund, die Verwendung der
matrix
Klasse zu vermeiden, besteht darin, dass a) sie von Natur aus zweidimensional ist und b) im Vergleich zu einem "normalen" Numpy-Array zusätzlicher Overhead entsteht. Wenn Sie nur lineare Algebra tun, können Sie auf jeden Fall die Matrixklasse verwenden ... Ich persönlich finde es jedoch schwieriger als es wert ist.Verwenden Sie für Arrays (vor Python 3.5)
dot
anstelle vonmatrixmultiply
.Z.B
Oder in neueren Versionen von numpy einfach verwenden
x.dot(y)
Persönlich finde ich es viel lesbarer als das
*
Operator, der eine Matrixmultiplikation impliziert ...Verwenden Sie für Arrays in Python 3.5
x @ y
.quelle
x.T.dot(A.T).dot(A).dot(x)
ist das nicht unlesbar, imo Jedem sein eigenes. Wenn Sie hauptsächlich Matrixmultiplikation durchführen, verwenden Sie auf jeden Fallnumpy.matrix
!numpy.matrixmultiply
es schwer zu tippen ist.numpy.dot
entspricht der Matrixmultiplikation. Wenn Sie die Notation wirklich nicht mögen, verwenden Sie diematrix
Klasse.Die wichtigsten Informationen für Operationen mit NumPy- Arrays im Vergleich zu Operationen mit NumPy- Matrizen sind:
Die NumPy-Matrix ist eine Unterklasse des NumPy-Arrays
NumPy- Array- Operationen sind elementweise (sobald die Übertragung berücksichtigt wurde)
NumPy- Matrixoperationen folgen den üblichen Regeln der linearen Algebra
Einige Code-Schnipsel zur Veranschaulichung:
Diese Operation schlägt jedoch fehl, wenn diese beiden NumPy-Matrizen in Arrays konvertiert werden:
Die Verwendung der NP.dot- Syntax funktioniert jedoch mit Arrays . Diese Operation funktioniert wie eine Matrixmultiplikation:
Benötigen Sie jemals eine NumPy-Matrix? Wird ein NumPy-Array für die Berechnung der linearen Algebra ausreichen (vorausgesetzt, Sie kennen die richtige Syntax, dh NP.dot)?
Die Regel scheint zu sein, dass wenn die Argumente (Arrays) Formen (mxn) haben, die mit einer bestimmten linearen Algebra-Operation kompatibel sind, Sie in Ordnung sind, andernfalls wirft NumPy.
Die einzige Ausnahme, auf die ich gestoßen bin (es gibt wahrscheinlich andere), ist die Berechnung der inversen Matrix .
Unten sind Ausschnitte, in denen ich eine reine lineare Algebra-Operation (tatsächlich aus Numpys linearer Algebra-Modul) aufgerufen und in einem NumPy-Array übergeben habe
Determinante eines Arrays:
Eigenvektoren / Eigenwertpaare :
Matrix norm :
qr Faktorisierung :
Matrix Rang :
Matrix - Zustand :
Für die Inversion ist jedoch eine NumPy- Matrix erforderlich:
Aber die Moore-Penrose-Pseudoinverse scheint gut zu funktionieren
quelle
In 3.5 bekam Python endlich einen Matrixmultiplikationsoperator . Die Syntax lautet
a @ b
.quelle
Es gibt eine Situation, in der der Punktoperator beim Umgang mit Arrays andere Antworten gibt als beim Umgang mit Matrizen. Angenommen, Folgendes:
Konvertieren wir sie in Matrizen:
Jetzt können wir für beide Fälle eine unterschiedliche Ausgabe sehen:
quelle
Referenz von http://docs.scipy.org/doc/scipy/reference/tutorial/linalg.html
... wird von der Verwendung der Klasse numpy.matrix abgeraten , da sie nichts hinzufügt, was mit 2D- Objekten numpy.ndarray nicht erreicht werden kann , und zu einer Verwirrung darüber führen kann, welche Klasse verwendet wird. Beispielsweise,
scipy.linalg- Operationen können gleichermaßen auf numpy.matrix- oder 2D- numpy.ndarray- Objekte angewendet werden.
quelle
Dieser Trick könnte das sein, wonach Sie suchen. Es ist eine Art einfache Bedienerüberlastung.
Sie können dann so etwas wie die vorgeschlagene Infix-Klasse wie folgt verwenden:
quelle
Ein einschlägiges Zitat aus PEP 465 - Ein dedizierter Infix-Operator für die Matrixmultiplikation , wie von @ petr-viktorin erwähnt, verdeutlicht das Problem, mit dem das OP konfrontiert war:
Die Einführung des
@
Infix-Operators sollte dazu beitragen, den Python-Matrix-Code zu vereinheitlichen und zu vereinfachen.quelle
Die Funktion matmul (seit numpy 1.10.1) funktioniert für beide Typen einwandfrei und gibt das Ergebnis als numpy-Matrixklasse zurück:
Ausgabe:
Seit Python 3.5 können Sie, wie bereits erwähnt , auch einen neuen Matrixmultiplikationsoperator
@
wie verwendenund erhalten Sie das gleiche Ergebnis wie oben.
quelle