我知道@
适用于装饰器,但Python中的@=
是什么?这只是对未来想法的保留吗?
这只是阅读tokenizer.py
时的众多问题之一。
答案 0 :(得分:162)
来自the documentation:
@
(at)运算符旨在用于矩阵乘法。没有内置的Python类型实现此运算符。
在Python 3.5中引入了@
运算符。正如您所期望的那样,@=
是矩阵乘法,然后是赋值。它们映射到__matmul__
,__rmatmul__
或__imatmul__
,类似于+
和+=
映射到__add__
,__radd__
或{{ 1}}。
在PEP 465中详细讨论了算子及其背后的基本原理。
答案 1 :(得分:42)
@=
和@
是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使用了以下惯例:
*
运算符(以及一般arithmetic operators)被定义为ndarrays上的元素操作和numpy.matrix类型的矩阵乘法。< / p>
method/function dot
用于ndarrays的矩阵乘法
@
运算符的引入使得涉及矩阵乘法的代码更容易阅读。 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 :(得分:2)
@是Python3.5中添加的Matrix Multiplication的新运算符
参考:https://docs.python.org/3/whatsnew/3.5.html#whatsnew-pep-465
实施例
C = A @ B