некоторые функции Numpy возвращают ndarray вместо моего подкласса

Я создаю подкласс класса 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)

>>> s3 = s + 17
>>> type (s3)

>>> s4 = np.sqrt(s)
>>> type(s4)

однако, что насчет этого?

>>> s5 = log10(s)
>>> type(s5)

>>> s6 = np.fft.fft(s)
>>> type(s6)

изучает код fft и log10 Я вижу, что они используют asarray () , который удаляет подкласс и возвращает ndarray, объясняя поведение. Поэтому мой вопрос не «почему технически это происходит», а скорее вопрос дизайна - как мне написать код, чтобы этого не произошло?

ps Я новичок и в Python, и здесь, в Stack Переполнение, извините, пожалуйста, за очевидные ошибки или несоответствия ...

спасибо, что насчет этого?

>>> s5 = log10(s)
>>> type(s5)

>>> s6 = np.fft.fft(s)
>>> type(s6)

глядя на код fft и log10 , я вижу, что они используют asarray () , который удаляет подкласс и возвращает ndarray, объясняя поведение. Поэтому мой вопрос не «почему технически это происходит», а скорее вопрос дизайна - как мне написать код, чтобы этого не произошло?

ps Я новичок и в Python, и здесь, в Stack Переполнение, извините, пожалуйста, за очевидные ошибки или несоответствия ...

спасибо, что насчет этого?

>>> s5 = log10(s)
>>> type(s5)

>>> s6 = np.fft.fft(s)
>>> type(s6)

глядя на код fft и log10 , я вижу, что они используют asarray () , который удаляет подкласс и возвращает ndarray, объясняя поведение. Поэтому мой вопрос не «почему технически это происходит», а скорее вопрос дизайна - как мне написать код, чтобы этого не произошло?

ps Я новичок и в Python, и здесь, в Stack Переполнение, извините, пожалуйста, за очевидные ошибки или несоответствия ...

спасибо, Парень.

11
задан tinkerer 31 May 2011 в 16:50
поделиться