@
はデコレータ用ですが、Pythonで@=
とは何ですか?将来のアイデアのためだけの予約ですか?
これは、tokenizer.py
を読んでいる間の私の多くの質問の1つにすぎません。
From thedocumentation :
@
(at)演算子は、行列の乗算に使用することを目的としています。この演算子を実装する組み込みPython型はありません。
@
演算子はPython 3.5で導入されました。 @=
は、ご想像のとおり、割り当てに続く行列乗算です。 __matmul__
、__rmatmul__
、または__imatmul__
にマップされます。+
および+=
が__add__
、__radd__
、または__iadd__
にマップする方法と同様です。
演算子とその背後にある理論的根拠は、 PEP 465 で詳細に説明されています。
@=
および@
は、Python3.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)
明らかに、最後の実装は方程式として読みやすく解釈しやすいです。
@は、Python3.5で追加された行列乗算の新しい演算子です。
リファレンス: https://docs.python.org/3/whatsnew/3.5.html#whatsnew-pep-465
例
C = A @ B