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