在python 3.5中,引入了@
运算符进行矩阵乘法运算,跟在PEP465后面。这是通过例如在numpy作为matmul operator。使矩阵乘法运算符@为numpy中的标量运算
然而,由于提出的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矩阵乘法”等价于标量乘法。然而,目前的状态迫使我编写重复的代码,以便正确处理这两种情况。
因此,鉴于目前的状态并不令人满意,是否有任何合理的方法可以使@
运营商适用于标量?我想过为标量数据类型添加一个自定义的__matmul__(self, other)
方法,但考虑到涉及的内部数据类型的数量,这似乎很麻烦。我是否可以将numpy数组数据类型的__matmul__
方法的实现更改为不引发1x1数组操作数的异常?
而且,在这个设计决策背后的理由是什么?从我的头顶来看,我想不出有什么令人信服的理由不要为标量实现这个操作符。
'[1] @ [2]'怎么样?标量已经有'*'为什么要复制它。 – furas
听起来像真正的问题是你的代码有时会返回标量,有时会返回矩阵。为什么不重构,以便您的代码返回1 x 1矩阵而不是标量?或者编写一个快速函数,该函数采用矩阵或标量并返回该矩阵或带有标量的1x1矩阵 –
为什么不能使用try - except例程? – Jalo