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.
import numpy as np
a = np.mat('4 3; 2 1')
b = np.mat('1 2; 3 4')
print(a)
# [[4 3]
# [2 1]]
print(b)
# [[1 2]
# [3 4]]
print(a*b)
# [[13 20]
# [ 5 8]]
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.
import numpy as np
a = np.array([[4, 3], [2, 1]])
b = np.array([[1, 2], [3, 4]])
print(a@b)
# [[13 20]
# [ 5 8]]
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 also a
und b
numpy Arrays sind, dann a*b
wird das Array durch Multiplikation der Komponenten elementweise gebildet:
c = np.array([[4, 3], [2, 1]])
d = np.array([[1, 2], [3, 4]])
print(c*d)
# [[4 6]
# [6 4]]
Um das Ergebnis der Matrixmultiplikation zu erhalten, verwenden Sie np.dot
(oder @
in Python> = 3.5, wie oben gezeigt):
print(np.dot(c,d))
# [[13 20]
# [ 5 8]]
Der **
Bediener verhält sich auch anders:
print(a**2)
# [[22 15]
# [10 7]]
print(c**2)
# [[16 9]
# [ 4 1]]
Da a
es sich um eine Matrix handelt, wird a**2
das Matrixprodukt zurückgegeben a*a
. Da c
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
und np.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 NumPy matrix
es hier .