Я создаю подкласс класса ndarray от Numpy, добавляю некоторые метаданные и дополнительные методы. Я пытаюсь следовать инструкциям в этой статье и этой . Однако некоторые функции 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, объясняя поведение. Поэтому мой вопрос не «почему, технически это происходит», а скорее вопрос дизайна - как мне написать свой код, чтобы этого не произошло?
p.s. Я новичок и в Python, и здесь, в Stack Overflow, поэтому прошу прощения за любые очевидные ошибки или неуместность ...
спасибо,
Гай.