@=
et @
sont de nouveaux opérateurs introduits dans Python 3.5 effectuant une multiplication matricielle . Ils visent à clarifier la confusion qui existait jusqu'à présent avec l'opérateur *
qui était utilisé soit pour la multiplication élément par élément, soit pour la multiplication matricielle en fonction de la convention employée dans cette bibliothèque / code particulier. En conséquence, à l'avenir, l'opérateur *
est destiné à être utilisé uniquement pour la multiplication élément par élément.
Comme expliqué dans PEP0465 , deux opérateurs ont été introduits:
- Un nouvel opérateur binaire
A @ B
, utilisé de la même manière queA * B
- Une version en place
A @= B
, utilisée de la même manière queA *= B
Multiplication matricielle vs multiplication par élément
Pour mettre rapidement en évidence la différence, pour deux matrices:
A = [[1, 2], B = [[11, 12],
[3, 4]] [13, 14]]
La multiplication par élément donnera:
A * B = [[1 * 11, 2 * 12],
[3 * 13, 4 * 14]]
La multiplication matricielle donnera:
A @ B = [[1 * 11 + 2 * 13, 1 * 12 + 2 * 14],
[3 * 11 + 4 * 13, 3 * 12 + 4 * 14]]
Utilisation dans Numpy
Jusqu'à présent, Numpy a utilisé la convention suivante:
L'introduction de l' @
opérateur rend le code impliquant des multiplications matricielles beaucoup plus facile à lire. PEP0465 nous donne un exemple:
# 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)
De toute évidence, la dernière implémentation est beaucoup plus facile à lire et à interpréter comme une équation.