我知道 @
是用于装饰器的,但在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]]
Element-wise multiplication will yield:
A * B = [[1 * 11, 2 * 12],
[3 * 13, 4 * 14]]
Matrix multiplication will yield:
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)
@
已经被实现用于list
,但事实并非如此。 - Conchylicultor@
与 np.matmul
相关联,而不是 np.dot
。这两者相似但并不相同。 - Asclepius@是Python3.5中新增的矩阵乘法运算符。
参考资料:https://docs.python.org/3/whatsnew/3.5.html#whatsnew-pep-465
示例
C = A @ B
:=
海象运算符,你就得到了所谓的@:=
棘手的玫瑰运算符。(在日本则被称为 Elvis-海象运算符。) - Bob Stein