@=
i @
są nowymi operatorami wprowadzonymi w Pythonie 3.5 wykonującymi mnożenie macierzy . Mają one na celu wyjaśnienie istniejącego do tej pory pomyłki z operatorem, *
który był używany albo do mnożenia elementów albo mnożenia macierzy, w zależności od konwencji zastosowanej w tej konkretnej bibliotece / kodzie. W rezultacie w przyszłości operator *
ma być używany tylko do mnożenia elementów.
Jak wyjaśniono w PEP0465 , wprowadzono dwóch operatorów:
- Nowy operator binarny
A @ B
, używany podobnie jakA * B
- Wersja lokalna
A @= B
, używana podobnie jakA *= B
Mnożenie macierzy a mnożenie według elementów
Aby szybko podkreślić różnicę, dla dwóch macierzy:
A = [[1, 2], B = [[11, 12],
[3, 4]] [13, 14]]
Mnożenie według elementów da:
A * B = [[1 * 11, 2 * 12],
[3 * 13, 4 * 14]]
Mnożenie macierzy da:
A @ B = [[1 * 11 + 2 * 13, 1 * 12 + 2 * 14],
[3 * 11 + 4 * 13, 3 * 12 + 4 * 14]]
Wykorzystanie w Numpy
Do tej pory Numpy stosował następującą konwencję:
Wprowadzenie @
operatora sprawia, że kod zawierający mnożenie macierzy jest znacznie łatwiejszy do odczytania. PEP0465 podaje nam przykład:
# 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)
Oczywiście ostatnia implementacja jest znacznie łatwiejsza do odczytania i zinterpretowania jako równanie.