繁体   English   中英

对于子类MaskedArray,ufunc的行为和数学运算符不同

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM