重载numpy.ndarray子类的数学运算

问题描述

我有一个类是numpy.ndarray的子类。在this example之后,我有一个Test,其行为类似于numpy.ndarray,但具有附加属性description

>>> f = Test([0.,1.,2.],description="f")
>>> f
array([0.,2.])
>>> f.description
'f'

f的行为类似于numpy.ndarray,所有数学运算的结果也将具有description属性

>>> fplusone = f + 1.
>>> fplusone
array([1.,2.,3.])
>>> fplusone.description
'f'

在更复杂的情况下,它具有以下行为:

>>> g = Test([1.,3.,2],description="g")
>>> g
array([1.,2.])
>>> g.description
'g'

>>> fplusg = f + g
>>> fplusg
array([1.,4.,4.])
>>> fplusg.description
'f'

>>> gplusf= g + f
>>> gplusf
array([1.,4.])
>>> gplusf.description
'g'

注意:顺序与description属性的结果有关。

那是我不想要的行为。基本上,我希望所有数学运算的结果都是numpy.ndarray,而不是Test的实例。

一个想法是使所有运算符重载,例如:

>>> class Test2(Test):
>>>
>>>    def __add__(self,val):
>>>        return numpy.array(super().__add__(val))


>>> f2 = Test2([0.,description="f2")
>>> f2.description
'f2'
>>> (f2 + 1.).description
AttributeError: 'numpy.ndarray' object has no attribute 'description'

我也希望所有Numpy功能都具有这种行为,例如这也应该引发一个AttributeError

>>> fgmax = numpy.maximum(f,g)
>>> fgmax
array([1.,2.])
>>> fgmax.description
'f'

所以我的问题是:
是否有一种简单的方法可以做到这一点而又不会手工重载每个算术运算符?对于每个可能的Numpy通用函数如何实现呢?

我还要注意由调用附加的numpy.array()引起的开销。 如果为所有运算符实现上述操作,则这样的操作将numpy.array()调用四次:

>>> f * g + f**2 / g

但是对我而言,最重要的是最终结果是numpy.ndarray,例如:

>>> numpy.array(f * g + f**2 / g)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)