simbolos - ¿Para qué sirve el símbolo ''@='' en Python?
string en python (3)
@ es el nuevo operador para Matrix Multiplication agregado en Python3.5
Referencia: https://docs.python.org/3/whatsnew/3.5.html#whatsnew-pep-465
Ejemplo
C = A @ B
Sé que
@
es para decoradores, pero ¿para qué sirve
@=
en Python?
¿Es solo una reserva para alguna idea futura?
Esta es solo una de mis muchas preguntas mientras leo
tokenizer.py
.
De the documentation :
El operador
@
(at) está destinado a ser utilizado para la multiplicación de matrices. Ningún tipo de Python incorporado implementa este operador.
El operador
@
se introdujo en Python 3.5.
@=
es una multiplicación matricial seguida de una asignación, como era de esperar.
Se asignan a
__matmul__
,
__rmatmul__
o
__imatmul__
similar a cómo
+
y
+=
asignan a
__add__
,
__radd__
o
__iadd__
.
El operador y la razón detrás de esto se discuten en detalle en PEP 465 .
@=
y
@
son nuevos operadores introducidos en Python
3.5 que
realizan
la multiplicación de matrices
.
Su objetivo es aclarar la confusión que existía hasta ahora con el operador
*
que se utilizó para la multiplicación por 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
*
debe usarse solo para la multiplicación por elementos.
Como se explica en PEP0465 , se presentaron dos operadores:
-
Un nuevo operador binario
A @ B
, utilizado de manera similar aA * B
-
Una versión in situ
A @= B
, utilizada de manera similar aA *= B
Multiplicación matricial vs 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 sabios producirá:
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 usó la siguiente convención:
-
el operador
*
(y los operadores aritméticos en general) se definieron como operaciones ndarrays en ndarrays en ndarrays y como multiplicación numpy.matrix tipo numpy.matrix . -
Se utilizó el method/function
dot
method/function para la multiplicación matricial de ndarrays
La introducción del operador
@
hace que el código que involucra multiplicaciones matriciales 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.