wake-up-neo.com

Was sind die Unterschiede zwischen Numpy Arrays und Matrizen? Welches soll ich verwenden?

Was sind die Vor- und Nachteile von jedem?

Nach dem, was ich gesehen habe, kann einer der beiden 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 mache maschinelles Lernen mit Numpy, also gibt es in der Tat viele Matrizen, aber auch viele Vektoren (Arrays).

307
levesque

Numpy-Matrizen sind streng 2-dimensional, 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 Zahlenmatrizen besteht darin, dass sie eine bequeme Notation für die Matrixmultiplikation bieten: Wenn a und b Matrizen sind, dann ist a * b 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-Matrixmultiplikation mit dem Operator @, Sodass Sie dieselbe Bequemlichkeit der Matrixmultiplikation mit ndarrays in Pythonerzielen können. _> = 3,5.

import numpy as np

a=np.array([[4, 3], [2, 1]])
b=np.array([[1, 2], [3, 4]])
print([email protected])
# [[13 20]
#  [ 5  8]]

Sowohl Matrixobjekte als auch ndarrays haben .T, Um die Transponierung zurückzugeben, aber Matrixobjekte haben auch .H Für die konjugierte Transponierung und .I Für die Inverse.

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 ist a*b Das Array, das durch Multiplizieren der Komponenten elementweise 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 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 Operator ** Verhält sich ebenfalls anders:

print(a**2)
# [[22 15]
#  [10  7]]
print(c**2)
# [[16  9]
#  [ 4  1]]

Da a eine Matrix ist, gibt a**2 Das Matrixprodukt a*a Zurück. Da c ein ndarray ist, gibt c**2 Ein ndarray mit jeder Komponente im Quadrat als Element zurück.

Es gibt weitere technische Unterschiede zwischen Matrixobjekten und Ndarrays (im Zusammenhang mit np.ravel, Elementauswahl und Sequenzverhalten).

Der Hauptvorteil von Numpy-Arrays besteht darin, dass sie allgemeiner sind als zweidimensionale Matrizen. Was passiert, wenn Sie ein 3-dimensionales Array möchten? Dann müssen Sie ein ndarray verwenden, kein Matrixobjekt. Das Erlernen der Verwendung von Matrixobjekten ist daher aufwändiger - Sie müssen Matrixobjektoperationen und ndarray-Operationen erlernen.

Das Schreiben eines Programms, das sowohl Matrizen als auch Arrays verwendet, 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 geringfügig 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 auf jeden Fall der richtige Weg.

PS. Natürlich müssen Sie keines auf Kosten des anderen auswählen, da Sie mit np.asmatrix Und np.asarray Eins in das andere konvertieren können (solange das Array 2 ist). dimensionale).


Es gibt eine Übersicht über die Unterschiede zwischen NumPy arrays und NumPy matrixes hier .

363
unutbu

Scipy.org empfiehlt die Verwendung von Arrays:

* 'Array' oder 'Matrix'? Welches soll ich verwenden? - Kurze Antwort

Verwenden Sie Arrays.

  • Sie sind der Standardtyp für Vektoren/Matrizen/Tensoren. Viele Numpy-Funktionen geben Arrays zurück, keine Matrizen.

  • Es gibt eine klare Unterscheidung zwischen elementweisen Operationen und linearen Algebraoperationen.

  • Wenn Sie möchten, können Sie Standardvektoren oder Zeilen-/Spaltenvektoren verwenden.

Der einzige Nachteil der Verwendung des Array-Typs besteht darin, dass Sie dot anstelle von * Verwenden müssen, um zwei Tensoren (Skalarprodukt, Matrixvektor-Multiplikation usw.) zu multiplizieren (zu reduzieren).

83
atomh33ls

Nur um einen Fall zur Liste von unutbu hinzuzufügen.

Einer der größten praktischen Unterschiede für mich bei Numpy-ndarrays im Vergleich zu Numpy-Matrizen oder Matrixsprachen wie matlab ist, dass die Dimension bei Reduktionsoperationen nicht beibehalten wird. Matrizen sind immer 2d, während der Mittelwert eines Arrays beispielsweise eine Dimension weniger hat.

Zum Beispiel demean Zeilen einer Matrix oder eines Arrays:

mit Matrix

>>> m = np.mat([[1,2],[2,3]])
>>> m
matrix([[1, 2],
        [2, 3]])
>>> mm = m.mean(1)
>>> mm
matrix([[ 1.5],
        [ 2.5]])
>>> mm.shape
(2, 1)
>>> m - mm
matrix([[-0.5,  0.5],
        [-0.5,  0.5]])

mit Array

>>> a = np.array([[1,2],[2,3]])
>>> a
array([[1, 2],
       [2, 3]])
>>> am = a.mean(1)
>>> am.shape
(2,)
>>> am
array([ 1.5,  2.5])
>>> a - am #wrong
array([[-0.5, -0.5],
       [ 0.5,  0.5]])
>>> a - am[:, np.newaxis]  #right
array([[-0.5,  0.5],
       [-0.5,  0.5]])

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 im Sinne von Operatoren wie der Multiplikation.

28
Josef

Wie andere bereits erwähnt haben, bestand der Hauptvorteil von matrix möglicherweise darin, dass es eine bequeme Notation für die Matrixmultiplikation bot.

Jedoch in Python 3.5 gibt es endlich einen dedizierten Infix-Operator für die Matrixmultiplikation : @.

In neueren NumPy-Versionen kann es mit ndarrays verwendet werden:

A = numpy.ones((1, 3))
B = numpy.ones((3, 3))
A @ B

Umso mehr sollten Sie sich heutzutage im Zweifelsfall an ndarray halten.

18
Peque