这个问题与 Overriding other __rmul__ with your class's __mul__中提出的问题相似,但我认为这不仅仅是数值数据的问题。此外该问题没有得到解答,我也不想使用矩阵乘法
我有一个对象,可以接受与标量和数字数组的乘法。通常情况下,左乘法很好用,因为它使用
这也导致无法检查数组的大小是否兼容。
因此,问题是:
@
来进行操作。因此,提出了这个问题。我有一个对象,可以接受与标量和数字数组的乘法。通常情况下,左乘法很好用,因为它使用
myobj()
方法,但在右乘法中,NumPy使用广播规则,并给出元素结果,dtype=object
。这也导致无法检查数组的大小是否兼容。
因此,问题是:
在我的特定情况下,这个对象是一个MIMO(多输入,多输出)传递函数矩阵(或者说滤波器系数矩阵),因此矩阵乘法在加法和线性系统乘法方面具有特殊含义。因此,在每个条目中都有SISO系统。有没有一种方法可以强制NumPy数组查找其他对象的
__rmul__()
而不是广播并执行元素级__mul__()
?
import numpy as np
class myobj():
def __init__(self):
pass
def __mul__(self, other):
if isinstance(other, type(np.array([0.]))):
if other.size == 1:
print('Scalar multiplication')
else:
print('Multiplication of arrays')
def __rmul__(self, other):
if isinstance(other, type(np.array([0.]))):
if other.size == 1:
print('Scalar multiplication')
else:
print('Multiplication of arrays')
A = myobj()
a = np.array([[[1+1j]]]) # some generic scalar
B = np.random.rand(3, 3)
通过这些定义,以下命令显示了不希望出现的行为。
In [123]: A*a
Scalar multiplication
In [124]: a*A
Out[124]: array([[[None]]], dtype=object)
In [125]: B*A
Out[125]:
array([[None, None, None],
[None, None, None],
[None, None, None]], dtype=object)
In [126]: A*B
Multiplication of arrays
In [127]: 5 * A
In [128]: A.__rmul__(B) # This is the desired behavior for B*A
Multiplication of arrays
@
,因为它是一个类似于np.dot
的操作符,而不是解决rmul
问题的地址。 - hpauljmul
和rmul
是Python语法基础问题。 - hpauljdot()
的操作,但我想以专门的方式处理行向量乘法。关键点在于广播。我对 mul 和 rmul 都很满意,因为如果不进行广播,numpy 将无法看到它如何进行乘法运算。请参见最后一个示例,它可以正常工作。 - percusse