在Python 3.5中,引入了矩阵乘法运算符
然而,正如PEP所提出的,当使用标量操作数调用numpy运算符时,会抛出异常。
这对我来说是一个真正的难题,因为我正在实现数值信号处理算法,应该适用于标量和矩阵。两种情况下的方程在数学上完全等价,这并不奇怪,因为“1-D x 1-D matrix multiplication”等同于标量乘法。然而,当前状态迫使我编写重复的代码以正确处理两种情况。
因此,考虑到当前状态并不令人满意,有没有任何合理的方法可以使@运算符适用于标量?我考虑为标量数据类型添加自定义__matmul__(self, other)方法,但考虑到涉及的内部数据类型数量,这似乎很麻烦。我能否更改numpy数组数据类型的__matmul__方法的实现,以便不会为1x1数组操作数抛出异常?
另外,这个设计决策的原理是什么呢?一时之间,我想不出任何不实现该运算符的强有力理由。
@
,该运算符遵循PEP465。例如,在numpy中,这是通过matmul运算符实现的。然而,正如PEP所提出的,当使用标量操作数调用numpy运算符时,会抛出异常。
>>> import numpy as np
>>> np.array([[1,2],[3,4]]) @ np.array([[1,2],[3,4]]) # works
array([[ 7, 10],
[15, 22]])
>>> 1 @ 2 # doesn't work
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: unsupported operand type(s) for @: 'int' and 'int'
这对我来说是一个真正的难题,因为我正在实现数值信号处理算法,应该适用于标量和矩阵。两种情况下的方程在数学上完全等价,这并不奇怪,因为“1-D x 1-D matrix multiplication”等同于标量乘法。然而,当前状态迫使我编写重复的代码以正确处理两种情况。
因此,考虑到当前状态并不令人满意,有没有任何合理的方法可以使@运算符适用于标量?我考虑为标量数据类型添加自定义__matmul__(self, other)方法,但考虑到涉及的内部数据类型数量,这似乎很麻烦。我能否更改numpy数组数据类型的__matmul__方法的实现,以便不会为1x1数组操作数抛出异常?
另外,这个设计决策的原理是什么呢?一时之间,我想不出任何不实现该运算符的强有力理由。
[1] @ [2]
怎么样?标量已经有了*
,为什么要重复呢? - furas[1] @ [2]
时,我想到的是类似于np.array([1]) @ np.array([2])
的东西,但我应该描述一下 :) - furasatleast_1d
,例如np.atleast_1d(5) @ np.atleast_1d(6)
就可以正常工作。 - Alex Riley