一些Numpy函数返回ndarray而不是我的子类

tin*_*rer 11 python numpy subclass

我是Numpy的ndarray类的子类,添加了一些元数据和其他方法.我试图按照指示这篇文章那一个.但是,一些Numpy(或Scipy)函数返回基类"ndarray"而不是我的自定义子类.其他Numpy函数返回我的子类,我不知道差异的原因是什么.如何让所有numpy/scipy函数返回我的子类?这就是我做的:

class Signal(np.ndarray):
    def __new__(cls, filename):
        #print "In __new__" #TEMP DEBUG
        ret = np.fromfile(filename, dtype = np.int32)
        ret = ret.view(cls) # convert to my class, i.e. Signal
        ret.parse_filename(filename)
        return ret

    def __array_finalize__(self, obj):
        #print "in __array_finalize__" #TEMP DEBUG
        if obj is None: return # shouldn't actually happen.
        # copy meta-fields from source, if it has them (otherwise put None's)
        self.filename = getattr(obj, "filename", None)
        self.folder = getattr(obj, "folder", None)
        self.label = getattr(obj, "label", None)
        self.date = getattr(obj, "date", None)
        self.time = getattr(obj, "time", None)
        #etc
Run Code Online (Sandbox Code Playgroud)

这里有一些用法示例:

这些工作如预期 -

>>> s = Signal(filename)
>>> s2 = s[10:20]
>>> type (s2)
<class '__main__.Signal'>
>>> s3 = s + 17
>>> type (s3)
<class '__main__.Signal'>
>>> s4 = np.sqrt(s)
>>> type(s4)
<class '__main__.Signal'>
Run Code Online (Sandbox Code Playgroud)

然而,这些呢?

>>> s5 = log10(s)
>>> type(s5)
<type 'numpy.ndarray'>
>>> s6 = np.fft.fft(s)
>>> type(s6)
<type 'numpy.ndarray'>
Run Code Online (Sandbox Code Playgroud)

寻找到的代码fftlog10我可以看到他们使用asarray(),这条的子类,并返回一个ndarray,解释的行为.因此,我的问题不是"为什么,从技术上讲,这种情况发生",而是更多的设计问题 - 我应该如何编写代码,以免发生这种情况?

ps我是Python的新手,也是Stack Overflow的新手,所以请原谅任何明显的错误或不恰当......

谢了,兄弟们.

NPE*_*NPE 1

我不确定fft,但它np.log10是一个ufunc。下一页解释了如何确定 ufunc 的输出类型:http://docs.scipy.org/doc/numpy/reference/ufuncs.html#output-type-metry

fft如果总是返回 an ndarraywhile (我没有查看源代码,但 FFT 显然不符合 ufunc 的定义),我不会感到惊讶。如果是这种情况,您始终可以编写自己的包装器并调用它。

  • 要对此进行扩展,您需要在子类中实现“__array_wrap__”方法。请参阅http://docs.scipy.org/doc/numpy/user/basics.subclassing.html#array-wrap-for-ufuncs。 (2认同)