Numpy 如何安全地对ndarray进行子类化,并使行为与ndarray-odd nanmin/max结果一致?

Numpy 如何安全地对ndarray进行子类化,并使行为与ndarray-odd nanmin/max结果一致?,numpy,Numpy,我正在尝试添加一些附加字段。然而,当我这样做时,我会在各种numpy函数中看到奇怪的行为。例如,nanmin returns现在返回一个与我的新数组类类型相同的对象,而以前我得到的是float64。为什么?这是南民还是我们班的问题 import numpy as np class NDArrayWithColumns(np.ndarray): def __new__(cls, obj, columns=None): obj = obj.view(cls)

我正在尝试添加一些附加字段。然而,当我这样做时,我会在各种numpy函数中看到奇怪的行为。例如,nanmin returns现在返回一个与我的新数组类类型相同的对象,而以前我得到的是float64。为什么?这是南民还是我们班的问题

import numpy as np

class NDArrayWithColumns(np.ndarray):
    def __new__(cls, obj, columns=None):
        obj = obj.view(cls)
        obj.columns = tuple(columns)
        return obj

    def __array_finalize__(self, obj):
        if obj is None: return
        self.columns = getattr(obj, 'columns', None)

NAN = float("nan")
r = np.array([1.,0.,1.,0.,1.,0.,1.,0.,NAN, 1., 1.])
print "MIN", np.nanmin(r), type(np.nanmin(r)) 
给出:

MIN 0.0 <type 'numpy.float64'>
min0.0
但是

>r=NDArrayWithColumns(r,[“a”])
>>>打印“最小”,np.nanmin(右),类型(np.nanmin(右))
最小0.0
>>>打印r形
(11,)
注意类型的变化,str(np.nanmin(r))显示的是1个字段,而不是11个字段


如果您感兴趣,我将进行子类化,因为我希望跟踪列名称是单一类型的矩阵,但结构数组和记录类型数组允许不同的类型)。

您需要实现
\uuuu数组\u wrap\uu
方法,该方法在
ufunc
结束时调用,具体如下:


我肯定没有用。您的代码不会更改最终的行为,也不清楚这里会使用什么决策逻辑来修复它。
>>> r = NDArrayWithColumns(r, ["a"])
>>> print "MIN", np.nanmin(r), type(np.nanmin(r))
MIN 0.0 <class '__main__.NDArrayWithColumns'>
>>> print r.shape 
(11,)
    def __array_wrap__(self, out_arr, context=None):
        print('In __array_wrap__:')
        print('   self is %s' % repr(self))
        print('   arr is %s' % repr(out_arr))
        # then just call the parent
        return np.ndarray.__array_wrap__(self, out_arr, context)