web-dev-qa-db-fra.com

A quoi sert le symbole "@ =" en Python?

Je connais @ est pour les décorateurs, mais qu'est-ce que @= pour en Python? Est-ce juste une réserve pour une idée future?

Ceci est juste une de mes nombreuses questions en lisant tokenizer.py.

154
Octavia Togami

De thedocumentation :

Le @ (at) operator est destiné à être utilisé pour la multiplication de matrices. Aucun type intégré Python implémentent cet opérateur.

Le @ l'opérateur a été introduit dans Python 3.5. @= est la multiplication matricielle suivie d’une affectation, comme on peut s’y attendre. Ils mappent à __matmul__, __rmatmul__ ou __imatmul__ semblable au comment + et += carte pour __add__, __radd__ ou __iadd__.

L'opérateur et les raisons qui le sous-tendent sont discutés en détail dans PEP 465 .

169
rightfold

@= et @ sont de nouveaux opérateurs introduits dans Python 3.5 effectuant une multiplication de matrice . Ils sont destinés à clarifier la confusion qui existait jusqu'à présent avec l'opérateur * qui a été utilisé pour la multiplication par élément ou pour la multiplication de matrice en fonction de la convention utilisée dans cette bibliothèque/code particulier. En conséquence, à l'avenir, l'opérateur * est destiné à être utilisé uniquement pour la multiplication d'éléments.

Comme expliqué dans PEP0465 , deux opérateurs ont été introduits:

  • Un nouvel opérateur binaire A @ B, utilisé de la même manière que A * B
  • Une version sur place A @= B, utilisé de la même manière que A *= B

Multiplication matricielle vs multiplication élémentaire

Pour souligner rapidement la différence, pour deux matrices:

A = [[1, 2],    B = [[11, 12],
     [3, 4]]         [13, 14]]
  • La multiplication par élément donnera:

    A * B = [[1 * 11,   2 * 12], 
             [3 * 13,   4 * 14]]
    
  • La multiplication matricielle donnera:

    A @ B  =  [[1 * 11 + 2 * 13,   1 * 12 + 2 * 14],
               [3 * 11 + 4 * 13,   3 * 12 + 4 * 14]]
    

Utilisation dans Numpy

Jusqu'à présent, Numpy a utilisé la convention suivante:

Introduction du @ opérateur facilite la lecture du code impliquant des multiplications matricielles. PEP0465 nous donne un exemple:

# 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)

Il est clair que la dernière implémentation est beaucoup plus facile à lire et à interpréter comme une équation.

45
Andrzej Pronobis

@ est le nouvel opérateur de multiplication de matrices ajouté à Python3.5

Référence: https://docs.python.org/3/whatsnew/3.5.html#whatsnew-pep-465

Exemple

C = A @ B
2
amehta