我试图继承numpy.ma.MaskedArray
,但是继续遇到一个问题,即在我的子类上直接使用数学运算符的行为与直接使用类似的ufunc不同。直接使用ufunc时(例如np.subtract(arr1, arr2)
),__ array_prepare __,__ array_finalize__和__array_wrap__都按预期调用,但是,当使用符号运算符(例如arr1-arr2
)时,只调用__array_finalize__。因此,当使用数学运算符时,我丢失了arr._optinfo
中存储的任何信息。
以下是说明问题的代码段。
#!/bin/env python
import numpy as np
from numpy.ma import MaskedArray, nomask
class InfoArray(MaskedArray):
def __new__(cls, info=None, data=None, mask=nomask, dtype=None,
copy=False, subok=True, ndmin=0, fill_value=None,
keep_mask=True, hard_mask=None, shrink=True, **kwargs):
obj = super(InfoArray, cls).__new__(cls, data=data, mask=mask,
dtype=dtype, copy=copy, subok=subok, ndmin=ndmin,
fill_value=fill_value, hard_mask=hard_mask,
shrink=shrink, **kwargs)
obj._optinfo['info'] = info
return obj
def __array_prepare__(self, out, context=None):
print '__array_prepare__'
return super(InfoArray, self).__array_prepare__(out, context)
def __array_wrap__(self, out, context=None):
print '__array_wrap__'
return super(InfoArray, self).__array_wrap__(out, context)
def __array_finalize__(self, obj):
print '__array_finalize__'
return super(InfoArray, self).__array_finalize__(obj)
if __name__ == "__main__":
arr1 = InfoArray('test', data=[1,2,3,4,5,6])
arr2 = InfoArray(data=[0,1,2,3,4,5])
diff1 = np.subtract(arr1, arr2)
print diff1._optinfo
diff2 = arr1-arr2
print diff2._optinfo
如果运行,输出如下所示:
$ python test_ma_sub.py
#Call to np.subtract(arr1, arr2) here
__array_finalize__
__array_finalize__
__array_prepare__
__array_finalize__
__array_wrap__
__array_finalize__
{'info': 'test'}
#Executing arr1-arr2 here
__array_finalize__
{}
有没有一种简单的方法可以让数学运算符提供与ufuncs相同的行为?
答案 0 :(得分:0)
这似乎是在Numpy v1.10.0版本中实现的合法错误,从v1.10.4版本开始就没有修复。 I have submitted this as an issue to the Numpy project.