A cosa serve il simbolo '@ =' in Python?


173

So che @è per i decoratori, ma a cosa serve @=Python? È solo una prenotazione per qualche idea futura?

Questa è solo una delle mie molte domande durante la lettura tokenizer.py.


1
Vedi cset c553d8f72d65 ( mirror GitHub ... più facile da leggere ) nel repository CPython.
Nick T,

SymbolHound è un motore di ricerca in grado di cercare simboli di punteggiatura. Tuttavia, la ricerca su @ = python non restituisce attualmente risultati pertinenti, poiché la documentazione di Python 3.5 contiene '@' ma non un esempio di '@ =' da nessuna parte. Ho inviato a SH un messaggio per aiutarlo a migliorarlo. Anche Python doc potrebbe migliorare.
smci,

1
In combinazione con l' := operatore tricheco di Python 3.8, ottieni quello che è noto come l' @:=operatore spinoso della rosa. (O in Giappone è noto come l'operatore Elvis-tricheco.)
Bob Stein

Risposte:


185

Dalla documentazione :

L' @operatore (at) deve essere utilizzato per la moltiplicazione di matrici. Nessun tipo di Python incorporato implementa questo operatore.

L' @operatore è stato introdotto in Python 3.5. @=è la moltiplicazione di matrici seguita da assegnazione, come ci si aspetterebbe. Essi mappano __matmul__, __rmatmul__o __imatmul__simile a come +e +=mappano __add__, __radd__o __iadd__.

L'operatore e la logica alla base sono discussi in dettaglio in PEP 465 .


12
Questo spiega perché è nell'ultima versione di tokenizer.py ma non i documenti 3.4.
Octavia Togami,

10

Questo è in conflitto con i decoratori di Python? Questo non è implementato in Python 2.n, giusto?
frankliuao,

4
Ciò non è in conflitto con i decoratori, poiché i decoratori non possono mai essere preceduti da un'espressione e gli operatori binari devono sempre essere preceduti da un'espressione.
destra del

58

@=e @sono nuovi operatori introdotti in Python 3.5 che eseguono la moltiplicazione di matrici . Esse hanno lo scopo di chiarire la confusione che esisteva finora con l'operatore *che era usata sia per la moltiplicazione degli elementi che per la moltiplicazione della matrice a seconda della convenzione impiegata in quel particolare codice / libreria. Di conseguenza, in futuro l'operatore *è destinato esclusivamente alla moltiplicazione degli elementi.

Come spiegato in PEP0465 , sono stati introdotti due operatori:

  • Un nuovo operatore binario A @ B, usato in modo simile aA * B
  • Una versione sul posto A @= B, usata allo stesso modo diA *= B

Moltiplicazione di matrici vs moltiplicazione di elementi

Per evidenziare rapidamente la differenza, per due matrici:

A = [[1, 2],    B = [[11, 12],
     [3, 4]]         [13, 14]]
  • La moltiplicazione degli elementi produrrà:

    A * B = [[1 * 11,   2 * 12], 
             [3 * 13,   4 * 14]]
    
  • La moltiplicazione della matrice produrrà:

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

Utilizzo in Numpy

Finora Numpy ha usato la seguente convenzione:

L'introduzione @dell'operatore semplifica la lettura del codice relativo alle moltiplicazioni delle matrici. PEP0465 ci dà un esempio:

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

Chiaramente, l'ultima implementazione è molto più facile da leggere e interpretare come un'equazione.


11
Solo per chiarimenti: dal tuo primo esempio, potremmo pensare che @sia stato implementato list, il che non è il caso.
Conchylicultor,

1
@è associato np.matmul, no np.dot. I due sono simili ma non uguali.
Acumenus,

@ABB, forse potresti fornire un esempio chiarendo la sfumatura e assicurandoti che la risposta sia completa?
benjaminmgross,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.