438 Stimmen

Was sind die Unterschiede zwischen Numpy-Arrays und Matrizen? Welche sollte ich verwenden?

Welches sind die Vor- und Nachteile der beiden?

Nach dem, was ich gesehen habe, kann einer der beiden als Ersatz für den anderen funktionieren, wenn es nötig ist, sollte ich mir also die Mühe machen, beide zu verwenden, oder sollte ich bei nur einem von ihnen bleiben?

Wird der Stil des Programms meine Wahl beeinflussen? Ich mache etwas maschinelles Lernen mit Numpy, also gibt es tatsächlich viele Matrizen, aber auch viele Vektoren (Arrays).

474voto

unutbu Punkte 769083

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í .

102voto

atomh33ls Punkte 25880

Scipy.org empfiehlt, dass Sie Arrays verwenden:

* Array" oder "Matrix"? Welche sollte ich verwenden? - Kurze Antwort

Arrays verwenden.

  • Sie unterstützen die mehrdimensionale Array-Algebra, die auch in MATLAB
  • Sie sind der Standard-Vektor/Matrix/Tensor-Typ von NumPy. Viele NumPy-Funktionen geben Arrays zurück, keine Matrizen.
  • Es gibt eine klare Unterschied zwischen elementweisen Operationen und Operationen der linearen Algebra Operationen.
  • Sie können Standardvektoren oder Zeilen/Spalten-Vektoren haben, wenn Sie mögen.

Bis Python 3.5 war der einzige Nachteil der Verwendung des Array-Typs war, dass man dot 代わりに * zur Multiplikation (Reduktion) zweier Tensoren (Skalarprodukt, Matrix-Vektor-Multiplikation usw.). Seit Python 3.5 können Sie die Matrixmultiplikation verwenden @ Betreiber.

In Anbetracht der obigen Ausführungen beabsichtigen wir die Abschaffung von matrix schließlich.

33voto

Josef Punkte 20578

Ich möchte die Liste von unutbu nur um einen Fall ergänzen.

Einer der größten praktischen Unterschiede von numpy ndarrays im Vergleich zu numpy matrices oder Matrixsprachen wie matlab ist für mich, dass die Dimension bei Reduktionsoperationen nicht erhalten bleibt. Matrizen sind immer 2d, während der Mittelwert eines Arrays zum Beispiel eine Dimension weniger hat.

Zum Beispiel die Zeilen einer Matrix oder eines Arrays entmischen:

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 die Vermischung von Arrays und Matrizen zu vielen "glücklichen" Debugging-Stunden führt. Allerdings sind scipy.sparse Matrizen immer Matrizen im Sinne von Operatoren wie Multiplikation.

32voto

Aks Punkte 475

Laut den offiziellen Dokumenten ist es nicht mehr ratsam, die Matrixklasse zu verwenden, da sie in Zukunft abgeschafft werden soll.

https://numpy.org/doc/stable/reference/generated/numpy.matrix.html

Wie bereits in anderen Antworten erwähnt, können Sie alle Operationen mit NumPy-Arrays durchführen.

23voto

Peque Punkte 11594

Wie bereits von anderen erwähnt, ist vielleicht der größte Vorteil von matrix war, dass es eine bequeme Notation für die Matrixmultiplikation bot.

Allerdings, in Python 3.5 gibt es endlich einen eigenen Infix-Operator für die Matrixmultiplikation : @ .

Mit neueren NumPy-Versionen kann es mit ndarray s:

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

Deshalb sollte man sich heutzutage im Zweifelsfall eher an ndarray .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X