Algunas funciones de Numpy devuelven ndarray en lugar de mi subclase

Estoy subclasificando la clase ndarray de Numpy, agregando algunos metadatos y métodos adicionales. Estoy tratando de seguir las instrucciones de este artículo y ese . Sin embargo, algunas funciones de Numpy (o Scipy) devuelven la clase base “ndarray” en lugar de mi subclase personalizada. Otras funciones de Numpy devuelven mi subclase, y no sé cuál es la razón de la diferencia. ¿Cómo puedo hacer que todas las funciones numpy / scipy devuelvan mi subclase? esto es lo que hice:

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, ie 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 

Aquí hay algunos ejemplos de uso:

estos funcionan como se esperaba –

 >>> s = Signal(filename) >>> s2 = s[10:20] >>> type (s2)  >>> s3 = s + 17 >>> type (s3)  >>> s4 = np.sqrt(s) >>> type(s4)  

Sin embargo, ¿qué pasa con estos?

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

buscando en el código de fft y log10 puedo ver que usan asarray() , que asarray() la subclase y devuelve un ndarray, explicando el comportamiento. Por lo tanto, mi pregunta no es “por qué, técnicamente, esto sucede”, sino más bien una pregunta de diseño: ¿cómo debo escribir mi código para que esto no suceda?

PD: soy un novato tanto en Python como aquí en Stack Overflow, así que disculpe cualquier error obvio o inadecuación …

Gracias amigo.

Related of "Algunas funciones de Numpy devuelven ndarray en lugar de mi subclase"

No estoy seguro de fft , pero np.log10 es un ufunc . La siguiente página explica cómo se determina el tipo de salida de ufunc: http://docs.scipy.org/doc/numpy/reference/ufuncs.html#output-type-determination

Sin embargo, no me sorprendería que fft siempre devolviera un ndarray (no he mirado el código fuente, pero la FFT claramente no se ajusta a la definición de ufunc). Si ese es el caso, siempre puedes escribir tu propio envoltorio y llamar a eso en su lugar.