我知道@代表装饰器,但是在Python中@=代表什么呢?这只是对未来想法的保留吗?

这只是我在阅读tokenizer.py时遇到的众多问题之一。


当前回答

@是在Python3.5中添加的用于矩阵乘法的新运算符

参考:https://docs.python.org/3/whatsnew/3.5.html whatsnew - pep - 465

例子

C = A @ B

其他回答

从文档中可以看到:

@ (at)运算符用于矩阵乘法。没有内置Python类型实现此操作符。

@操作符是在Python 3.5中引入的。@=是矩阵乘法,后面跟着赋值,正如你所期望的那样。它们映射到__matmul__, __rmatmul__或__imatmul__,类似于+和+=映射到__add__, __radd__或__iadd__。

在PEP 465中详细讨论了运算符及其背后的原理。

@是在Python3.5中添加的用于矩阵乘法的新运算符

参考:https://docs.python.org/3/whatsnew/3.5.html whatsnew - pep - 465

例子

C = A @ B

@=和@是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使用了以下约定:

*操作符(以及一般的算术操作符)被定义为ndarray上的逐元素操作和numpy上的矩阵乘法。矩阵类型。 采用方法/函数点对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)

显然,最后一个实现更容易阅读和解释为一个方程。