对于子类MaskedArray

时间:2016-01-26 01:25:08

标签: python numpy

我试图继承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相同的行为?

1 个答案:

答案 0 :(得分:0)

这似乎是在Numpy v1.10.0版本中实现的合法错误,从v1.10.4版本开始就没有修复。 I have submitted this as an issue to the Numpy project.