[英]Behavior of ufuncs and mathematical operators differ for subclassed MaskedArray
我正在尝试将numpy.ma.MaskedArray
子类numpy.ma.MaskedArray
,但是一直遇到一个问题,即直接在子类上使用数学运算符的行为与直接使用类似的ufunc的行为不同。 直接使用np.subtract(arr1, arr2)
(例如np.subtract(arr1, arr2)
)时, np.subtract(arr1, arr2)
预期方式被调用,但是,当使用符号运算符(例如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__
{}
是否有一种简单的方法可以使数学运算符提供与ufunc相同的行为?
这似乎是在Numpy v1.10.0版本中实现的合法错误,并且在v1.10.4版本中尚未修复。 我已将此问题提交给Numpy项目。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.