Solución:
De la documentación:
los
@
El operador (arroba) está destinado a ser utilizado para la multiplicación de matrices. Ningún tipo de Python incorporado implementa este operador.
los @
El operador se introdujo en Python 3.5. @=
es la multiplicación de matrices seguida de una asignación, como era de esperar. Ellos mapean a __matmul__
, __rmatmul__
o __imatmul__
similar a como +
y +=
mapa para __add__
, __radd__
o __iadd__
.
El operador y la razón fundamental detrás de él se discuten en detalle en PEP 465.
@=
y @
son nuevos operadores introducidos en Python 3,5 ejecutando multiplicación de matrices. Están destinados a aclarar la confusión que existía hasta ahora con el operador. *
que se usó para la multiplicación de elementos o la multiplicación de matrices según la convención empleada en esa biblioteca / código en particular. Como resultado, en el futuro, el operador *
está diseñado para usarse solo para la multiplicación de elementos.
Como se explica en PEP0465, se introdujeron dos operadores:
- Un nuevo operador binario
A @ B
, usado de manera similar comoA * B
- Una versión in situ
A @= B
, usado de manera similar comoA *= B
Multiplicación de matrices frente a multiplicación por elementos
Para resaltar rápidamente la diferencia, para dos matrices:
A = [[1, 2], B = [[11, 12],
[3, 4]] [13, 14]]
-
La multiplicación por elementos dará como resultado:
A * B = [[1 * 11, 2 * 12], [3 * 13, 4 * 14]]
-
La multiplicación de matrices producirá:
A @ B = [[1 * 11 + 2 * 13, 1 * 12 + 2 * 14], [3 * 11 + 4 * 13, 3 * 12 + 4 * 14]]
Uso en Numpy
Hasta ahora, Numpy utilizó la siguiente convención:
-
los
*
El operador (y los operadores aritméticos en general) se definieron como operaciones de elementos en ndarrays y como multiplicación de matrices en el tipo numpy.matrix. -
método / función
dot
se utilizó para la multiplicación de matrices de ndarrays
Introducción de la @
El operador hace que el código que involucra multiplicaciones de matrices sea mucho más fácil de leer. PEP0465 nos da un ejemplo:
# Current implementation of matrix multiplications using dot function
S = np.dot((np.dot(H, beta) - r).T,
np.dot(inv(np.dot(np.dot(H, V), H.T)), np.dot(H, beta) - r))
# Current implementation of matrix multiplications using dot method
S = (H.dot(beta) - r).T.dot(inv(H.dot(V).dot(H.T))).dot(H.dot(beta) - r)
# Using the @ operator instead
S = (H @ beta - r).T @ inv(H @ V @ H.T) @ (H @ beta - r)
Claramente, la última implementación es mucho más fácil de leer e interpretar como una ecuación.
@ es el nuevo operador para la multiplicación de matrices agregado en Python3.5
Referencia: https://docs.python.org/3/whatsnew/3.5.html#whatsnew-pep-465
Ejemplo
C = A @ B