@=
и @
введены ли в Python 3.5 новые операторы, выполняющие умножение матриц . Они призваны прояснить путаницу, существовавшую до сих пор с оператором, *
который использовался либо для поэлементного умножения, либо для умножения матриц в зависимости от соглашения, используемого в этой конкретной библиотеке / коде. В результате в будущем оператор *
предназначен для использования только для поэлементного умножения.
Как объяснено в PEP0465 , были введены два оператора:
- Новый бинарный оператор
A @ B
, используемый аналогичноA * B
- Версия на месте
A @= B
, используемая аналогичноA *= B
Матричное Умножение против Поэлементного Умножения
Чтобы быстро выделить разницу, для двух матриц:
A = [[1, 2], B = [[11, 12],
[3, 4]] [13, 14]]
Поэлементное умножение даст:
A * B = [[1 * 11, 2 * 12],
[3 * 13, 4 * 14]]
Матричное умножение даст:
A @ B = [[1 * 11 + 2 * 13, 1 * 12 + 2 * 14],
[3 * 11 + 4 * 13, 3 * 12 + 4 * 14]]
Использование в Numpy
До сих пор Numpy использовал следующее соглашение:
Введение @
оператора значительно облегчает чтение кода с умножением матриц. PEP0465 дает нам пример:
# 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)
Понятно, что последнюю реализацию гораздо проще читать и интерпретировать как уравнение.