Wofür steht das Symbol '@ =' in Python?

173

Ich weiß, @ist für Dekorateure, aber wofür ist @=in Python? Ist es nur ein Vorbehalt für eine zukünftige Idee?

Dies ist nur eine meiner vielen Fragen beim Lesen tokenizer.py.

Octavia Togami
quelle
1
Siehe cset c553d8f72d65 ( GitHub-Spiegel ... einfacher zu lesen ) im CPython-Repo.
Nick T
SymbolHound ist eine Suchmaschine, die nach Interpunktionssymbolen suchen kann. Die Suche in @ = Python liefert derzeit jedoch keine relevanten Ergebnisse, da die Python 3.5-Dokumentation '@' enthält, jedoch nirgendwo ein Beispiel für '@ ='. Ich habe SH eine Nachricht geschickt, um das zu verbessern. Python-Dokument könnte sich ebenfalls verbessern.
smci
1
In Kombination mit dem := Walross-Operator von Python 3.8 erhalten Sie den sogenannten @:=Dornrosen-Operator. (Oder in Japan ist es als Elvis-Walross-Betreiber bekannt.)
Bob Stein

Antworten:

185

Aus der Dokumentation :

Der @(at) -Operator soll für die Matrixmultiplikation verwendet werden. Kein eingebauter Python-Typ implementiert diesen Operator.

Der @Operator wurde in Python 3.5 eingeführt. @=ist die Matrixmultiplikation, gefolgt von der Zuweisung, wie Sie es erwarten würden. Sie bilden auf __matmul__, __rmatmul__oder __imatmul__ähnlich, wie +und +=Karte auf __add__, __radd__oder __iadd__.

Der Betreiber und die Gründe dafür werden in PEP 465 ausführlich erörtert .

Rechtsfalte
quelle
12
Das erklärt, warum es in der neuesten Version von tokenizer.py ist, aber nicht in den 3.4-Dokumenten.
Octavia Togami
10
Dies wird in den Dokumenten von 3.5 behandelt - docs.python.org/3.5/reference/… und docs.python.org/3.5/reference/…
jonrsharpe
Hat dies einen Konflikt mit Python-Dekorateuren? Dies ist in Python 2.n nicht implementiert, oder?
Frankliuao
4
Dies widerspricht Dekoratoren nicht, da Dekoratoren möglicherweise niemals ein Ausdruck vorangestellt wird und binären Operatoren immer ein Ausdruck vorangestellt werden muss.
Rechtsfalte
58

@=und @sind neue Operatoren, die in Python 3.5 eingeführt wurden und eine Matrixmultiplikation durchführen . Sie sollen die bisherige Verwechslung mit dem Operator verdeutlichen, der *je nach der in dieser bestimmten Bibliothek / diesem Code verwendeten Konvention entweder für die elementweise Multiplikation oder die Matrixmultiplikation verwendet wurde. Infolgedessen soll der Operator in Zukunft *nur noch für die elementweise Multiplikation verwendet werden.

Wie in PEP0465 erläutert , wurden zwei Operatoren eingeführt:

  • Ein neuer binärer Operator A @ B, der ähnlich wie verwendet wirdA * B
  • Eine In-Place-Version A @= B, die ähnlich wie verwendet wirdA *= B

Matrixmultiplikation vs. elementweise Multiplikation

Um den Unterschied für zwei Matrizen schnell hervorzuheben:

A = [[1, 2],    B = [[11, 12],
     [3, 4]]         [13, 14]]
  • Die elementweise Multiplikation ergibt:

    A * B = [[1 * 11,   2 * 12], 
             [3 * 13,   4 * 14]]
  • Die Matrixmultiplikation ergibt:

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

Verwendung in Numpy

Bisher verwendete Numpy die folgende Konvention:

Die Einführung des @Operators erleichtert das Lesen des Codes mit Matrixmultiplikationen erheblich. PEP0465 gibt uns ein Beispiel:

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

Es ist klar, dass die letzte Implementierung viel einfacher zu lesen und als Gleichung zu interpretieren ist.

Andrzej Pronobis
quelle
11
Nur zur Verdeutlichung: Von Ihrem ersten Beispiel könnten wir denken, dass @dies implementiert wurde list, was nicht der Fall ist.
Conchylicultor
1
@ist verbunden mit np.matmul, nicht np.dot. Die beiden sind ähnlich, aber nicht gleich.
Acumenus
@ABB, könnten Sie vielleicht ein Beispiel liefern, das die Nuance verdeutlicht und sicherstellt, dass die Antwort dann vollständig ist?
benjaminmgross