如何解决重载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 举报,一经查实,本站将立刻删除。