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