некоторые функции Numpy возвращают ndarray вместо моего подкласса - PullRequest
11 голосов
/ 31 мая 2011

Я создаю подкласс класса 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, поэтому прошу прощения за любые очевидные ошибки или неуместность ...

спасибо, Гай.

1 Ответ

1 голос
/ 31 мая 2011

Я не уверен насчет fft, но np.log10 - это ufunc .На следующей странице объясняется, как определяется тип вывода ufunc: http://docs.scipy.org/doc/numpy/reference/ufuncs.html#output-type-determination

Меня не удивит, если fft всегда будет возвращать ndarray, хотя (я не смотрел исходный код, но БПФ явно не соответствует определению уфунка).Если это так, вы всегда можете написать свою собственную обертку и вызвать ее вместо этого.

...