numpy.matmul
La función numpy.matmul también realiza la multiplicación de matrices entre dos matrices, pero tiene reglas ligeramente diferentes para manejar matrices multidimensionales. Las dos matrices deben tener la misma forma, excepto para las dos últimas dimensiones, que deben coincidir. Si alguna matriz es 1-D, se la promueve a una matriz agregando un 1 a su forma.
C = np.matmul(A, B)
print(C)
## Salida:
## array([[19, 22],
## [43, 50]])
En este ejemplo, obtenemos el mismo resultado que con numpy.dot. Esto se debe a que nuestras matrices A y B tienen la misma forma, por lo que numpy.matmul se comporta de la misma manera que numpy.dot.
Y hay otro ejemplo 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)
## Salida:
## array([[[ 31, 34],
## [ 71, 78]],
## [[155, 166],
## [211, 226]]])
print(d)
## Salida:
## array([[[[ 31, 34],
## [ 43, 46]],
## [[ 71, 78],
## [ 99, 106]]],
## [[[111, 122],
## [155, 166]],
## [[151, 166],
## [211, 226]]]])
En este ejemplo, numpy.matmul realiza la operación de multiplicación de matrices en lotes.
Dado que tanto a como b son matrices 3-D, la salida de numpy.dot tendrá dimensionalidad (2,2,2,2). Las dos primeras dimensiones corresponden a los dos lotes de matrices 2\times2 en a y b. Las dos dimensiones siguientes corresponden al producto punto de cada par de matrices 2\times2 en los 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]]