numpy.matmul
A função numpy.matmul também realiza a multiplicação de matrizes entre dois arrays, mas possui regras ligeiramente diferentes para lidar com arrays multidimensionais. Os dois arrays devem ter a mesma forma (shape), exceto pelas duas últimas dimensões, que devem ser compatíveis. Se qualquer um dos arrays for 1-D, ele é promovido a uma matriz adicionando um 1 à sua forma.
C = np.matmul(A, B)
print(C)
## Output:
## array([[19, 22],
## [43, 50]])
Neste exemplo, obtemos o mesmo resultado que com numpy.dot. Isso ocorre porque nossos arrays A e B têm a mesma forma, então numpy.matmul se comporta da mesma maneira que numpy.dot.
E há outro exemplo diferente:
## define two 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)
## Output:
## array([[[ 31, 34],
## [ 71, 78]],
## [[155, 166],
## [211, 226]]])
print(d)
## Output:
## array([[[[ 31, 34],
## [ 43, 46]],
## [[ 71, 78],
## [ 99, 106]]],
## [[[111, 122],
## [155, 166]],
## [[151, 166],
## [211, 226]]]])
Neste exemplo, numpy.matmul realiza a operação de multiplicação de matrizes em lote (batch matrix multiplication).
Como a e b são arrays 3-D, a saída de numpy.dot terá dimensionalidade (2,2,2,2). As duas primeiras dimensões correspondem aos dois lotes de matrizes 2\times2 em a e b. As duas dimensões seguintes correspondem ao produto escalar (dot product) de cada par de matrizes 2\times2 nos lotes:
## the first 2 × 2 result
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]]