在python中,`@=`作用在左边还是右边?
In python, does `@=` act on the left or the right?
对我来说很明显 vector @= matrix
应该表示 vector = matrix @ vector
,这与大多数其他二元运算符的做法相反。不幸的是,PEP 465 完全省略了对此的任何讨论;它仅说明 @
运算符是左关联的,并且 @=
运算符对应于 __imatmul__
函数。
据推测,覆盖意味着数字库可以根据需要选择此行为,但这留下了三个密切相关的问题:
- 如果未明确提供
__imatmul__
,但 __matmul__
和 __rmatmul__
是,默认行为是什么?
- PEP 作者的意图是什么?
- numpy 等数值库选择了哪些行为来实现?
与任何其他增强赋值运算符一样,x @= y
是 x = x @ y
.
的就地-if-x
-支持版本
x = y @ x
对你来说可能是显而易见的,但我认为除了 x = x @ y
之外没有其他任何东西被认为是一个严肃的选择,而且我认为没有任何主要的数学库已经实现任何像你期望的那样。 sympy.Matrix
将其实现为 x = x @ y
(非可变,无 __imatmul__
),numpy.ndarray
表示
TypeError: In-place matrix multiplication is not (yet) supported. Use 'a = a @ b' instead of 'a @= b'.
(使用 NumPy 1.19.5 和 1.21.5 进行检查)。
请注意,NumPy 为“向量@矩阵”操作定义了一个有用的含义。 NumPy 不强制数组是二维的,因此 NumPy 中最常见的向量表示是一维数组,而不是列向量。一维数组的行为类似于“向量@矩阵”操作中的行向量,但结果将是一维而不是行向量。
对我来说很明显 vector @= matrix
应该表示 vector = matrix @ vector
,这与大多数其他二元运算符的做法相反。不幸的是,PEP 465 完全省略了对此的任何讨论;它仅说明 @
运算符是左关联的,并且 @=
运算符对应于 __imatmul__
函数。
据推测,覆盖意味着数字库可以根据需要选择此行为,但这留下了三个密切相关的问题:
- 如果未明确提供
__imatmul__
,但__matmul__
和__rmatmul__
是,默认行为是什么? - PEP 作者的意图是什么?
- numpy 等数值库选择了哪些行为来实现?
与任何其他增强赋值运算符一样,x @= y
是 x = x @ y
.
x
-支持版本
x = y @ x
对你来说可能是显而易见的,但我认为除了 x = x @ y
之外没有其他任何东西被认为是一个严肃的选择,而且我认为没有任何主要的数学库已经实现任何像你期望的那样。 sympy.Matrix
将其实现为 x = x @ y
(非可变,无 __imatmul__
),numpy.ndarray
表示
TypeError: In-place matrix multiplication is not (yet) supported. Use 'a = a @ b' instead of 'a @= b'.
(使用 NumPy 1.19.5 和 1.21.5 进行检查)。
请注意,NumPy 为“向量@矩阵”操作定义了一个有用的含义。 NumPy 不强制数组是二维的,因此 NumPy 中最常见的向量表示是一维数组,而不是列向量。一维数组的行为类似于“向量@矩阵”操作中的行向量,但结果将是一维而不是行向量。