numpy.matmul
Die numpy.matmul-Funktion führt ebenfalls eine Matrizenmultiplikation zwischen zwei Arrays durch, hat jedoch leicht unterschiedliche Regeln für die Behandlung von mehrdimensionalen Arrays. Die beiden Arrays müssen die gleiche Form haben, außer für die letzten beiden Dimensionen, die übereinstimmen müssen. Wenn eines der Arrays 1-D ist, wird es durch Anhängen einer 1 an seine Form zu einer Matrix aufgestockt.
C = np.matmul(A, B)
print(C)
## Ausgabe:
## array([[19, 22],
## [43, 50]])
In diesem Beispiel erhalten wir das gleiche Ergebnis wie mit numpy.dot. Dies liegt daran, dass unsere Arrays A und B die gleiche Form haben, sodass numpy.matmul auf die gleiche Weise wie numpy.dot funktioniert.
Und hier ist ein anderes unterschiedliches Beispiel:
## definieren Sie zwei 3-D Arrays
a = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
b = np.array([[[9, 10], [11, 12]], [[13, 14], [15, 16]]])
c = np.matmul(a, b)
d = np.dot(a, b)
print(c)
## Ausgabe:
## array([[[ 31, 34],
## [ 71, 78]],
## [[155, 166],
## [211, 226]]])
print(d)
## Ausgabe:
## array([[[[ 31, 34],
## [ 43, 46]],
## [[ 71, 78],
## [ 99, 106]]],
## [[[111, 122],
## [155, 166]],
## [[151, 166],
## [211, 226]]]])
In diesem Beispiel führt numpy.matmul die Batch-Matrizenmultiplikation durch.
Da sowohl a als auch b 3-D Arrays sind, wird die Ausgabe von numpy.dot eine Dimension (2,2,2,2) haben. Die ersten beiden Dimensionen entsprechen den zwei Batches von 2\times2-Matrizen in a und b. Die nächsten beiden Dimensionen entsprechen dem Skalarprodukt jeder Paar von 2\times2-Matrizen in den Batches:
## das erste 2 × 2-Ergebnis
dot(a[0], b[0]) =
dot([[1, 2],
[3, 4]],
[[9, 10],
[11, 12]]
= [[1*9 + 2*11, 1*10 + 2*12],
[3*9 + 4*11, 3*10 + 4*12]]
= [[31, 34],
[43, 46]]