Numpy Matrizen sind streng 2-dimensional, während numpy Arrays (nDarrays) sind N-dimensional. Matrix-Objekte sind eine Unterklasse von ndarray, sie erben also alle die Attribute und Methoden von ndarrays.
Der Hauptvorteil von Numpy-Matrizen ist, dass sie eine praktische Notation bieten für Matrixmultiplikation bieten: Wenn a und b Matrizen sind, dann a*b
ist ihre Matrix Produkt.
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 seit Python 3.5 die Infix-Matrix-Multiplikation mit der Option @
Operator, so dass Sie in Python >= 3.5 den gleichen Komfort der Matrixmultiplikation mit ndarrays erreichen 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 haben .T
um die Transponierung zurückzugeben, aber die Matrix Objekte haben 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 die Operationen elementweise angewendet werden (mit Ausnahme der neuen @
Operator). Wenn also a
y b
numpy-Arrays sind, dann a*b
ist das Array das durch elementweise Multiplikation der Komponenten gebildet wird:
c = np.array([[4, 3], [2, 1]])
d = np.array([[1, 2], [3, 4]])
print(c*d)
# [[4 6]
# [6 4]]
Um das Ergebnis einer Matrixmultiplikation zu erhalten, verwenden Sie np.dot
(o @
in Python >= 3.5, wie oben gezeigt):
print(np.dot(c,d))
# [[13 20]
# [ 5 8]]
En **
Operator verhält sich ebenfalls anders:
print(a**2)
# [[22 15]
# [10 7]]
print(c**2)
# [[16 9]
# [ 4 1]]
Seit a
ist eine Matrix, a**2
liefert das Matrixprodukt a*a
. Seit c
ist ein ndarray, c**2
gibt ein ndarray mit jeder Komponente zum Quadrat zurück Element-weise.
Es gibt weitere technische Unterschiede zwischen Matrix-Objekten und ndarrays (diese haben zu tun mit np.ravel
, Itemauswahl und Sequenzverhalten).
Der Hauptvorteil von Numpy-Arrays ist, dass sie allgemeiner sind als 2-dimensionale Matrizen . Was passiert, wenn Sie ein 3-dimensionales Array benötigen? Dann müssen Sie ein ndarray verwenden, kein Matrix-Objekt. Daher ist das Erlernen der Verwendung von Matrix Objekte zu lernen, ist also mehr Arbeit - man muss die Operationen von Matrixobjekten und ndarray-Operationen.
Das Schreiben eines Programms, das sowohl Matrizen als auch Arrays enthält, macht Ihnen das Leben schwer denn Sie müssen immer wissen, um welchen Objekttyp es sich bei Ihren Variablen handelt, damit die Multiplikation etwas zurückgibt, was Sie nicht erwarten.
Wenn Sie dagegen nur ndarrays verwenden, können Sie alles tun was Matrix-Objekte können, und noch mehr, nur mit etwas anderen Funktionen/Notation.
Wenn Sie bereit sind, auf die visuelle Attraktivität des NumPy-Matrixprodukts Notation zu verzichten (die in Python >= 3.5 fast genauso elegant mit ndarrays erreicht werden kann), dann denke ich, dass NumPy-Arrays definitiv der richtige Weg sind.
PS. Natürlich muss man sich nicht für das eine auf Kosten des anderen entscheiden, denn np.asmatrix
y np.asarray
ermöglichen die Umwandlung eines in das andere (als solange das Array 2-dimensional ist).
Es gibt eine Übersicht über die Unterschiede zwischen NumPy arrays
gegen NumPy matrix
es aquí .