【发布时间】:2011-09-05 15:49:49
【问题描述】:
我正在继承 Numpy 的 ndarray 类,添加一些元数据和其他方法。我正在尝试按照this article 和that one 中的说明进行操作。但是,一些 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
以下是一些用法示例:
这些按预期工作 -
>>> 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'>
但是,这些呢?
>>> s5 = log10(s)
>>> type(s5)
<type 'numpy.ndarray'>
>>> s6 = np.fft.fft(s)
>>> type(s6)
<type 'numpy.ndarray'>
查看fft 和log10 的代码我可以看到他们使用asarray(),它剥离子类并返回一个ndarray,解释行为。因此,我的问题不是“从技术上讲,为什么会发生这种情况”,而更多的是一个设计问题——我应该如何编写代码才能避免这种情况发生?
附言我是 Python 和 Stack Overflow 的新手,所以请原谅任何明显的错误或不当之处...
谢谢, 伙计。
【问题讨论】: