【问题标题】:What is the '@=' symbol for in Python?Python中的'@='符号是什么?
【发布时间】:2015-02-07 17:45:36
【问题描述】:

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

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

【问题讨论】:

  • 请参阅 CPython 存储库中的 cset c553d8f72d65 (GitHub mirror...easier to read)。
  • SymbolHound 是一个可以搜索标点符号的搜索引擎。但是searching on @= python 目前不返回相关结果,因为 Python 3.5 文档在任何地方都包含 '@' 但不是 '@=' 的示例。我给 SH 发了一条消息来帮助改善这一点。 Python 文档也可以改进。
  • 与 Python 3.8 的 := walrus operator 结合,您将得到所谓的 @:= 棘手玫瑰运算符。 (或者在日本它被称为猫王海象运算符。)

标签: python python-3.x operators matrix-multiplication python-3.5


【解决方案1】:

来自thedocumentation

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

@ 运算符是在 Python 3.5 中引入的。 @= 是矩阵乘法,然后是赋值,正如您所期望的那样。它们映射到__matmul____rmatmul____imatmul__,类似于++= 映射到__add____radd____iadd__

运营商及其背后的原理在PEP 465中有详细讨论。

【讨论】:

  • 这就解释了为什么它在最新版本的 tokenizer.py 而不是 3.4 文档中。
  • 这和 Python 装饰器有冲突吗?这不是在 Python 2.n 中实现的,对吧?
  • 这不会与装饰器冲突,因为装饰器可能永远不会在表达式之前,而二元运算符必须始终在表达式之前。
【解决方案2】:

@=@ 是 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)

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

【讨论】:

  • 只是为了澄清:从你的第一个例子中,我们可以认为@ 已经为list 实现了,事实并非如此。
  • @np.matmul 关联,而不是 np.dot。两者相似但不相同。
  • @A-B-B,也许您可​​以提供一个示例来阐明细微差别并确保答案是完整的?
【解决方案3】:

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

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

例子

C = A @ B

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-29
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    相关资源
    最近更新 更多