Numpy 如何安全地对ndarray进行子类化,并使行为与ndarray-odd nanmin/max结果一致?
我正在尝试添加一些附加字段。然而,当我这样做时,我会在各种numpy函数中看到奇怪的行为。例如,nanmin returns现在返回一个与我的新数组类类型相同的对象,而以前我得到的是float64。为什么?这是南民还是我们班的问题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)
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)