Я знаю, что @
для декораторов, но что такое @=
для Python? Это просто резервирование для будущей идеи?
Это только один из моих многочисленных вопросов при чтении tokenizer.py.
Я знаю, что @
для декораторов, но что такое @=
для Python? Это просто резервирование для будущей идеи?
Это только один из моих многочисленных вопросов при чтении tokenizer.py.
Из документация:
Оператор
@
(at) предназначен для использования в матричном умножении. Никакие встроенные типы Python не реализуют этот оператор.
Оператор @
был введен в Python 3.5. @=
представляет собой матричное умножение с последующим присваиванием, как и следовало ожидать. Они сопоставляются с __matmul__
, __rmatmul__
или __imatmul__
похожими на +
и +=
на __add__
, __radd__
или __iadd__
.
Оператор и его обоснование подробно обсуждаются в PEP 465.
@=
и @
- новые операторы, введенные в 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 использовала следующее соглашение:
Оператор *
(и арифметические операторы в целом) были определены как элементарные операции над ndarrays и как матричное умножение на numpy.matrix.
Введение оператора @
упрощает чтение кода с использованием матричных умножений. 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)
Очевидно, что последняя реализация намного проще читать и интерпретировать как уравнение.
@- новый оператор для умножения матриц, добавленный в Python3.5
Ссылка: https://docs.python.org/3/whatsnew/3.5.html#whatsnew-pep-465
Пример
C = A @ B