问题:Python中的’@ =’符号是什么?
我知道@
是给装饰器用的,但是@=
Python有什么用呢?只是保留一些未来的想法吗?
这只是我阅读时遇到的许多问题之一tokenizer.py
。
回答 0
的
@
(在)操作者意图被用于矩阵乘法。没有内置的Python类型实现此运算符。
该@
运算符是在Python 3.5中引入的。@=
正如您所期望的那样,是矩阵乘法,后跟赋值。它们映射到__matmul__
,__rmatmul__
或__imatmul__
类似于如何+
和+=
映射__add__
,__radd__
或__iadd__
。
在PEP 465中详细讨论了操作员及其背后的原理。
回答 1
@=
和@
是Python 3.5中引入的用于执行矩阵乘法的新运算符。它们的目的是澄清迄今为止与运算符之间存在的混淆,该运算符*
根据该特定库/代码中采用的约定用于元素方式乘法或矩阵乘法。结果,将来,运营商*
只能用于按元素乘法。
如PEP0465中所述,引入了两个运算符:
- 一个新的二进制运算符
A @ B
,与A * B
- 就地版本
A @= B
,与A *= B
矩阵乘法与按元素乘法
为了快速突出区别,对于两个矩阵:
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使用以下约定:
的
*
操作者(和算术运算符在普通)被定义为在元件为单位的运算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)
显然,最后一种实现更易于阅读和解释为等式。
回答 2
@是Python3.5中新增的矩阵乘法运算符
参考:https : //docs.python.org/3/whatsnew/3.5.html#whatsnew-pep-465
例
C = A @ B