Python中的“@ =”符号是什么?

我知道@是装饰器,但在Python中@=是什么? 这只是保留一些未来的想法吗?

在阅读tokenizer.py时,这只是我的许多问题之一。

从文档 :

@ (at)运算符用于matrix乘法。 没有内build的Pythontypes实现这个操作符。

@运算符是在Python 3.5中引入的。 @=是matrix乘法,随后是赋值,就像你所期望的那样。 它们映射到__matmul____rmatmul____imatmul__类似于++=映射到__add____radd____iadd__

PEP 465详细讨论了操作者及其背后的基本原理。

@=@是Python 3.5中引入的新运算符,用于执行matrix乘法 。 它们是为了澄清迄今为止​​存在的与运算符*有关的混淆,根据该特定的库/代码中使用的约定,该运算符被用于元素乘法或matrix乘法。 因此,将来运算符*仅用于元素乘法。

正如PEP0465所解释的那样 ,两名操作员被介绍:

  • 一个新的二元运算符A @ B ,与A * B类似使用
  • 就地版本A @= B ,与A *= B类似使用

matrix乘法和元素乘法

要快速突出显示的差异,对于两个matrix:

 A = [[1, 2], B = [[11, 12], [3, 4]] [13, 14]] 
  • 元素乘法将产生:

     A * B = [[1 * 11, 2 * 12], [3 * 13, 4 * 14]] 
  • matrix乘法将产生:

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

在Numpy中的用法

到目前为止,Numpy使用了以下约定:

  • *运算符(以及一般的算术运算符 )在ndarrays上定义为元素操作,在numpy.matrixtypes上定义为matrix乘法。

  • 方法/函数 dot被用于ndarrays的matrix乘法

@运算符的引入使涉及matrix乘法的代码更容易阅读。 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), HT)), 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(HT))).dot(H.dot(beta) - r) # Using the @ operator instead S = (H @ beta - r).T @ inv(H @ V @ HT) @ (H @ beta - r) 

显然,最后的实现更容易阅读和解释为一个等式。

@是Python3.5中添加的Matrix Multiplication的新运算符

参考: https : //docs.python.org/3/whatsnew/3.5.html#whatsnew-pep-465

 C = A @ B