@=
e @
sono nuovi operatori introdotti in Python 3.5 che eseguono la moltiplicazione di matrici . Esse hanno lo scopo di chiarire la confusione che esisteva finora con l'operatore *
che era usata sia per la moltiplicazione degli elementi che per la moltiplicazione della matrice a seconda della convenzione impiegata in quel particolare codice / libreria. Di conseguenza, in futuro l'operatore *
è destinato esclusivamente alla moltiplicazione degli elementi.
Come spiegato in PEP0465 , sono stati introdotti due operatori:
- Un nuovo operatore binario
A @ B
, usato in modo simile aA * B
- Una versione sul posto
A @= B
, usata allo stesso modo diA *= B
Moltiplicazione di matrici vs moltiplicazione di elementi
Per evidenziare rapidamente la differenza, per due matrici:
A = [[1, 2], B = [[11, 12],
[3, 4]] [13, 14]]
La moltiplicazione degli elementi produrrà:
A * B = [[1 * 11, 2 * 12],
[3 * 13, 4 * 14]]
La moltiplicazione della matrice produrrà:
A @ B = [[1 * 11 + 2 * 13, 1 * 12 + 2 * 14],
[3 * 11 + 4 * 13, 3 * 12 + 4 * 14]]
Utilizzo in Numpy
Finora Numpy ha usato la seguente convenzione:
L'introduzione @
dell'operatore semplifica la lettura del codice relativo alle moltiplicazioni delle matrici. PEP0465 ci dà un esempio:
# 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)
Chiaramente, l'ultima implementazione è molto più facile da leggere e interpretare come un'equazione.