我知道@
是用于装饰器的,但@=
在 Python 中是为了什么?它只是为一些未来的想法保留吗?
这只是我阅读时的许多问题之一tokenizer.py
。
我知道@
是用于装饰器的,但@=
在 Python 中是为了什么?它只是为一些未来的想法保留吗?
这只是我阅读时的许多问题之一tokenizer.py
。
@=
并且是 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 使用了以下约定:
*
运算符(和一般的算术运算符)被定义为 ndarrays 上的元素操作和numpy.matrix类型上的矩阵乘法。
方法/函数 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)
显然,最后一个实现更容易阅读和解释为等式。