NumPy Dot gegen Matmul in Python

Manav Narula 30 März 2021
NumPy Dot gegen Matmul in Python

In Python werden Arrays als Vektoren behandelt. 2D-Arrays werden auch als Matrizen bezeichnet. Wir haben Funktionen zur Verfügung, um Multiplikation zwischen ihnen in Python durchzuführen. Die beiden verwendeten Methoden sind die Funktion numpy.dot() und der Operator @ (die Methode __matmul__ des Arrays). Nun scheint es, dass beide die gleiche Multiplikationsfunktion haben. Es gibt jedoch einen Unterschied zwischen beiden, der in diesem Tutorial erläutert wird.

Die Funktion numpy.dot() wird zur Durchführung der Matrixmultiplikation in Python verwendet. Es prüft auch die Bedingung für die Matrixmultiplikation, dh die Anzahl der Spalten der ersten Matrix muss gleich der Anzahl der Zeilen der zweiten Matrix sein. Es funktioniert auch mit mehrdimensionalen Arrays. Wir können auch ein alternatives Array als Parameter zum Speichern des Ergebnisses angeben. Der Operator @ für die Multiplikation ruft die Funktion matmul() eines Arrays auf, mit dem dieselbe Multiplikation durchgeführt wird. Zum Beispiel,

import numpy as np

a = np.array([[1, 2], [2, 3]])
b = np.array(([8, 4], [4, 7]))
print(np.dot(a, b))
print(a @ b)

Ausgabe:

[[16 18]
 [28 29]]
[[16 18]
 [28 29]]

Wenn wir uns jedoch mit mehrdimensionalen Arrays (N-D-Arrays mit N> 2) befassen, ist das Ergebnis etwas anders. Sie können den Unterschied unten sehen.

a = np.random.rand(2, 3, 3)
b = np.random.rand(2, 3, 3)
c = a @ b
d = np.dot(a, b)
print(c, c.shape)
print(d, d.shape)

Ausgabe:

[[[0.63629871 0.55054463 0.22289276]
  [1.27578425 1.13950519 0.55370078]
  [1.37809353 1.32313811 0.75460862]]

 [[1.63546361 1.54607801 0.67134528]
  [1.05906619 1.07509384 0.42526795]
  [1.38932102 1.32829749 0.47240808]]] (2, 3, 3)
[[[[0.63629871 0.55054463 0.22289276]
   [0.7938068  0.85668481 0.26504028]]

  [[1.27578425 1.13950519 0.55370078]
   [1.55589497 1.45794424 0.5335743 ]]

  [[1.37809353 1.32313811 0.75460862]
   [1.60564885 1.39494713 0.59370927]]]


 [[[1.48529826 1.55580834 0.96142976]
   [1.63546361 1.54607801 0.67134528]]

  [[0.94601586 0.97181894 0.56701004]
   [1.05906619 1.07509384 0.42526795]]

  [[1.13268609 1.00262696 0.47226983]
   [1.38932102 1.32829749 0.47240808]]]] (2, 3, 2, 3)

Die Funktion matmul() sendet das Array wie einen Stapel von Matrizen als Elemente, die sich in den letzten beiden Indizes befinden. Die Funktion numpy.dot() führt dagegen eine Multiplikation als Summe der Produkte über die letzte Achse des ersten Arrays und die vorletzte des zweiten Arrays durch.

Ein weiterer Unterschied zwischen der Funktion matmul() und der Funktion numpy.dot besteht darin, dass die Funktion matmul() keine Multiplikation des Arrays mit skalaren Werten durchführen kann.

Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn