Python中的'@ ='符号是什么?

Oct*_*ami 158 python operators matrix-multiplication python-3.x python-3.5

我知道@是装饰器,但@=Python的用途是什么?这只是对未来想法的保留吗?

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

rig*_*old 176

文档:

@(在)操作者意图被用于矩阵乘法.没有内置的Python类型实现此运算符.

@操作符是在Python 3.5中引入的.@=正如您所期望的那样,是矩阵乘法,然后是赋值.它们映射到__matmul__,__rmatmul____imatmul__类似于如何++=映射__add__,__radd____iadd__.

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

  • 这就解释了为什么它在tokenizer.py的最新版本中,而不是3.4文档. (12认同)
  • 这包含在3.5的文档中 - https://docs.python.org/3.5/reference/simple_stmts.html#augmented-assignment-statements和https://docs.python.org/3.5/reference/expressions.html #二进制算术运算 (10认同)
  • 这不会与装饰器冲突,因为装饰器可能永远不会在表达式之前,并且二元运算符必须始终以表达式开头. (4认同)

And*_*bis 48

@=并且@是Python 3.5中引入的新运算符,执行矩阵乘法.它们旨在澄清迄今为止​​与运算符存在的混淆,运算符*用于元素乘法或矩阵乘法,这取决于特定库/代码中采用的约定.因此,将来,运算符*仅用于逐元素乘法.

PEP0465中所述,引入了两个运营商:

  • 一个新的二元运算符A @ B,类似于A * B
  • 就地版本A @= B,类似于A *= B

矩阵乘法与元素乘法

为了快速突出差异,对于两个矩阵:

A = [[1, 2],    B = [[11, 12],
     [3, 4]]         [13, 14]]
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

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

  • 只是为了澄清:从你的第一个例子中,我们可以认为`@`已经实现了`list`,但事实并非如此. (9认同)
  • `@` 与 `np.matmul` 关联,而不是 `np.dot`。两者相似但不相同。 (2认同)

ame*_*hta 10

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

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

例子

C = A @ B
Run Code Online (Sandbox Code Playgroud)