Was sind die Vor- und Nachteile von jedem?
Nach allem, was ich gesehen habe, kann einer bei Bedarf als Ersatz für den anderen dienen. Sollte ich mir also die Mühe machen, beide zu verwenden, oder sollte ich mich nur an einen von ihnen halten?
Wird der Stil des Programms meine Wahl beeinflussen? Ich lerne maschinell mit Numpy, also gibt es zwar viele Matrizen, aber auch viele Vektoren (Arrays).
A @ B
anstattA.dot(B)
, woA
undB
sind 2Dsndarray
. Dies beseitigt den Hauptvorteil der Verwendungmatrix
vonndarray
IMHO anstelle von einfachen s.Antworten:
Gemäß den offiziellen Dokumenten ist es nicht mehr ratsam, eine Matrixklasse zu verwenden, da diese in Zukunft entfernt wird.
https://numpy.org/doc/stable/reference/generated/numpy.matrix.html
Wie bereits in anderen Antworten angegeben, können Sie alle Operationen mit NumPy-Arrays ausführen.
quelle
Numpy- Matrizen sind streng zweidimensional, während Numpy- Arrays (ndarrays) N-dimensional sind. Matrixobjekte sind eine Unterklasse von ndarray, daher erben sie alle Attribute und Methoden von ndarrays.
Der Hauptvorteil von Numpy-Matrizen besteht darin, dass sie eine bequeme Notation für die Matrixmultiplikation bieten: Wenn a und b Matrizen sind,
a*b
ist dies ihr Matrixprodukt.Andererseits unterstützt NumPy ab Python 3.5 die Infix-Matrix-Multiplikation mit dem
@
Operator, sodass Sie mit ndarrays in Python> = 3.5 den gleichen Komfort der Matrix-Multiplikation erzielen können.Sowohl Matrixobjekte als auch ndarrays müssen
.T
die Transponierte zurückgeben, aber Matrixobjekte müssen auch.H
für die konjugierte Transponierung und.I
für die Umkehrung.Im Gegensatz dazu halten sich Numpy-Arrays konsequent an die Regel, dass Operationen elementweise angewendet werden (mit Ausnahme des neuen
@
Operators). Wenn alsoa
undb
numpy Arrays sind, danna*b
wird das Array durch Multiplikation der Komponenten elementweise gebildet:Um das Ergebnis der Matrixmultiplikation zu erhalten, verwenden Sie
np.dot
(oder@
in Python> = 3.5, wie oben gezeigt):Der
**
Bediener verhält sich auch anders:Da
a
es sich um eine Matrix handelt, wirda**2
das Matrixprodukt zurückgegebena*a
. Dac
es sich um ein ndarray handelt, wird ein ndarray zurückgegeben,c**2
wobei jede Komponente elementweise quadriert wird.Es gibt andere technische Unterschiede zwischen Matrixobjekten und ndarrays (was mit der
np.ravel
Elementauswahl und dem Sequenzverhalten zu tun hat ).Der Hauptvorteil von Numpy-Arrays besteht darin, dass sie allgemeiner sind als zweidimensionale Matrizen . Was passiert, wenn Sie ein dreidimensionales Array wünschen? Dann müssen Sie ein ndarray verwenden, kein Matrixobjekt. Das Erlernen der Verwendung von Matrixobjekten ist daher mehr Arbeit - Sie müssen Matrixobjektoperationen und Ndarray-Operationen lernen.
Das Schreiben eines Programms, das sowohl Matrizen als auch Arrays mischt, erschwert Ihr Leben, da Sie verfolgen müssen, um welche Art von Objekt es sich bei Ihren Variablen handelt, damit die Multiplikation nicht etwas zurückgibt, das Sie nicht erwarten.
Wenn Sie sich dagegen ausschließlich an ndarrays halten, können Sie alles tun, was Matrixobjekte können, und mehr, außer mit leicht unterschiedlichen Funktionen / Notationen.
Wenn Sie bereit sind, die visuelle Attraktivität der NumPy-Matrix-Produktnotation aufzugeben (die mit ndarrays in Python> = 3.5 fast genauso elegant erreicht werden kann), dann sind NumPy-Arrays meiner Meinung nach definitiv der richtige Weg.
PS. Natürlich haben Sie wirklich nicht eine auf Kosten des anderen zu wählen, da
np.asmatrix
undnp.asarray
ermöglicht es Ihnen , einen zum anderen (solange das Array 2-dimensional ist) zu konvertieren.Es gibt eine Übersicht über die Unterschiede zwischen NumPy
arrays
vs NumPymatrix
es hier .quelle
mat**n
eine Matrix unelegant auf ein Array mitreduce(np.dot, [arr]*n)
np.linalg.matrix_power(mat, n)
np.dot(array2, array2)
schneller sind alsmatrix1*matrix2
. Dies ist sinnvoll, damatrix
es sich um eine Unterklasse von ndarray handelt, die spezielle Methoden wie überschreibt__mul__
.matrix.__mul__
Anrufenp.dot
. Hier wird also Code wiederverwendet. Anstatt weniger Überprüfungen durchzuführen,matrix*matrix
erfordert die Verwendung einen zusätzlichen Funktionsaufruf. Der Vorteil der Verwendungmatrix
liegt also in der rein syntaktischen und nicht in der besseren Leistung.Scipy.org empfiehlt die Verwendung von Arrays:
quelle
ndarray
. Das Hauptargument für die Verwendungmatrix
wäre, wenn Ihr Code schwer in linearer Algebra ist und bei allen Aufrufen derdot
Funktion weniger klar aussehen würde . Dieses Argument wird jedoch in Zukunft verschwinden, da der @ -Operator zur Verwendung mit der Matrixmultiplikation akzeptiert wird (siehe PEP 465) . Dies erfordert Python 3.5 und die neueste Version von Numpy. Die Matrixklasse könnte in ferner Zukunft veraltet sein, daher ist es besser, ndarray für neuen Code zu verwenden ...scipy.sparse
Matrizen. Wenn Sie in Ihrem Code sowohl dichte als auch spärliche Matrizen verwenden, ist es viel einfacher, sich daran zu haltenmatrix
.Nur um einen Fall zur Liste von unutbu hinzuzufügen.
Einer der größten praktischen Unterschiede zwischen numpy ndarrays und numpy Matrizen oder Matrixsprachen wie matlab besteht für mich darin, dass die Dimension bei Reduktionsoperationen nicht erhalten bleibt. Matrizen sind immer 2d, während der Mittelwert eines Arrays beispielsweise eine Dimension weniger hat.
Zum Beispiel erniedrigen Zeilen einer Matrix oder eines Arrays:
mit Matrix
mit Array
Ich denke auch, dass das Mischen von Arrays und Matrizen zu vielen "glücklichen" Debugging-Stunden führt. Scipy.sparse-Matrizen sind jedoch immer Matrizen in Bezug auf Operatoren wie Multiplikation.
quelle
Wie andere bereits erwähnt haben, bestand der Hauptvorteil möglicherweise
matrix
darin, dass eine bequeme Notation für die Matrixmultiplikation bereitgestellt wurde.In Python 3.5 gibt es jedoch endlich einen dedizierten Infix-Operator für die Matrixmultiplikation :
@
.In neueren NumPy-Versionen kann es mit
ndarray
s verwendet werden:Heutzutage sollten Sie sich im Zweifelsfall noch mehr daran halten
ndarray
.quelle