Что такое символ @@в Python?

Я знаю, что @ для декораторов, но что такое @= для Python? Это просто резервирование для будущей идеи?

Это только один из моих многочисленных вопросов при чтении tokenizer.py.

Ответ 1

Из документация:

Оператор @ (at) предназначен для использования в матричном умножении. Никакие встроенные типы Python не реализуют этот оператор.

Оператор @ был введен в Python 3.5. @= представляет собой матричное умножение с последующим присваиванием, как и следовало ожидать. Они сопоставляются с __matmul__, __rmatmul__ или __imatmul__ похожими на + и += на __add__, __radd__ или __iadd__.

Оператор и его обоснование подробно обсуждаются в PEP 465.

Ответ 2

@= и @ - новые операторы, введенные в 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 использовала следующее соглашение:

  • Оператор *арифметические операторы в целом) были определены как элементарные операции над ndarrays и как матричное умножение на numpy.matrix.

  • dot использовался для матричного умножения ndarrays

Введение оператора @ упрощает чтение кода с использованием матричных умножений. 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)

Очевидно, что последняя реализация намного проще читать и интерпретировать как уравнение.