210

我知道@是用于装饰器的,但@=在 Python 中是为了什么?它只是为一些未来的想法保留吗?

这只是我阅读时的许多问题之一tokenizer.py

4

3 回答 3

233

文档

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

@运算符是在 Python 3.5 中引入的。@=如您所料,是矩阵乘法,然后是赋值。它们映射到__matmul__或类似于如何映射到__rmatmul__或。__imatmul__++=__add____radd____iadd__

PEP 465中详细讨论了运营商及其背后的基本原理。

于 2014-12-09T18:00:48.133 回答
91

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

运算符的引入@使涉及矩阵乘法的代码更易于阅读。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)

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

于 2015-06-03T19:44:18.690 回答
7

@是Python3.5新增的矩阵乘法运算符

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

例子

C = A @ B
于 2017-08-10T17:25:17.273 回答