Pythonの「@ =」記号は何ですか?


173

@はデコレータ用であることがわかっていますが@=、Pythonでは何ですか?将来のアイデアを予約するだけですか?

これは、読んでtokenizer.pyいる間の多くの質問の1つにすぎません。


1
CPythonリポジトリのcset c553d8f72d65GitHubミラー...読みやすい)を参照してください。
Nick T

SymbolHoundは、句読記号で検索できる検索エンジンです。ただし、@ = pythonを検索しても、現在関連する結果は返されません。Python3.5のドキュメントには「@」が含まれていますが、「@ =」の例は含まれていないためです。それを改善するためのメッセージをSHに送信しました。Pythonドキュメントも改善される可能性があります。
smci

1
Python 3.8の:= セイウチ演算子と組み合わせると、@:=とげがあるバラ演算子と呼ばれるものが得られます。(または日本では、エルビスウォーラスオペレーターとして知られています。)
ボブスタイン

回答:


185

以下からのドキュメント

@(AT)演算子は、行列乗算のために使用されることが意図されます。この演算子を実装する組み込みのPythonタイプはありません。

この@演算子はPython 3.5で導入されました。@=予想通り、行列の乗算とそれに続く代入です。彼らはにマッピング__matmul____rmatmul__または__imatmul__どのように類似+して+=にマッピング__add____radd__または__iadd__

オペレーターとその背後にある根拠については、PEP 465で詳しく説明されています。


12
それが、tokenizer.pyの最新バージョンではあるが、3.4ドキュメントではない理由を説明しています。
Octavia Togami 14

10
これは、3.5のドキュメントで覆われている- docs.python.org/3.5/reference/...docs.python.org/3.5/reference/...は
jonrsharpe

これはPythonデコレータと競合しますか?これはPython 2.nでは実装されていませんよね?
frankliuao 2017年

4
これはデコレータと競合しません。これは、デコレータの前に式を置くことはできず、2項演算子の前には必ず式を付ける必要があるためです。
右折

58

@=および@は、行列乗算を実行するPython 3.5で導入された新しい演算子です。これらは、特定のライブラリ/コードで採用されている規則に応じて、要素ごとの乗算または行列の乗算に使用された演算子とこれまでに存在した混乱を明確にすることを目的としています。その結果、将来的には、演算子は要素ごとの乗算にのみ使用されるようになっています。**

PEP0465で説明されているように、2つのオペレーターが導入されました。

  • 新しい二項演算子 A @ Bと同様に使用されるA * B
  • A @= B同じ場所で使用されるインプレースバージョンA *= B

行列乗算と要素ごとの乗算

2つの行列の違いをすばやく強調するには:

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は次の規則を使用しています。

@演算子の導入により、行列の乗算を含むコードが非常に読みやすくなります。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)

明らかに、最後の実装の方が読みやすく、方程式として解釈する方がはるかに簡単です。


11
明確にするために:最初の例から、それ@はに実装されていると考えることができますがlist、そうではありません。
コンキリクリトール2017年

1
@には関連付けられてnp.matmulnp.dotますが、には関連付けられていません。2つは似ていますが、同じではありません。
Acumenus 2017

@ABB、おそらく、ニュアンスを明確にし、答えが完全であることを確認する例を提供できますか?
benjaminmgross

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.