私@
はデコレータ用であることがわかっていますが@=
、Pythonでは何ですか?将来のアイデアを予約するだけですか?
これは、読んでtokenizer.py
いる間の多くの質問の1つにすぎません。
私@
はデコレータ用であることがわかっていますが@=
、Pythonでは何ですか?将来のアイデアを予約するだけですか?
これは、読んでtokenizer.py
いる間の多くの質問の1つにすぎません。
回答:
以下からのドキュメント:
@
(AT)演算子は、行列乗算のために使用されることが意図されます。この演算子を実装する組み込みのPythonタイプはありません。
この@
演算子はPython 3.5で導入されました。@=
予想通り、行列の乗算とそれに続く代入です。彼らはにマッピング__matmul__
、__rmatmul__
または__imatmul__
どのように類似+
して+=
にマッピング__add__
、__radd__
または__iadd__
。
オペレーターとその背後にある根拠については、PEP 465で詳しく説明されています。
@=
および@
は、行列乗算を実行する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は次の規則を使用しています。
*
オペレータ(及び算術演算子一般的には)上の要素単位操作として定義されたndarraysとにマトリックス乗算としてnumpy.matrixのタイプ。
メソッド/関数 dot
がndarrayの行列乗算に使用されました
@
演算子の導入により、行列の乗算を含むコードが非常に読みやすくなります。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)
明らかに、最後の実装の方が読みやすく、方程式として解釈する方がはるかに簡単です。
@
はに実装されていると考えることができますがlist
、そうではありません。
@
には関連付けられてnp.matmul
いnp.dot
ますが、には関連付けられていません。2つは似ていますが、同じではありません。
@は、Python3.5で追加された行列乗算の新しい演算子です。
参照: https //docs.python.org/3/whatsnew/3.5.html#whatsnew-pep-465
例
C = A @ B