I am subclassing Numpy's ndarray class, adding some meta-data and additional methods. I'm trying to follow the instructions in this article and that one. However, some Numpy (or Scipy) functions return the base class "ndarray" instead of my custom subclass. Other Numpy functions DO return my subclass, and I don't know what's the reason for the difference. How can I make all the numpy/scipy functions return my subclass? here's what I did:
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
here are some usage examples:
these work as expected -
>>> 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'>
however, what about these?
>>> s5 = log10(s)
>>> type(s5)
<type 'numpy.ndarray'>
>>> s6 = np.fft.fft(s)
>>> type(s6)
<type 'numpy.ndarray'>
looking into the code of fft
and log10
I can see that they use asarray()
, which strips the subclass and returns an ndarray, explaining the behavior. Therefore, my question isn't "why, technically, this happens" but more a design question - how should I write my code so this doesn't happen?
p.s. I'm a newbie both at Python and here on Stack Overflow, so please excuse any obvious mistakes or inappropriateness...
thanks, Guy.
The main data structure in NumPy is the ndarray, which is a shorthand name for N-dimensional array. When working with NumPy, data in an ndarray is simply referred to as an array. It is a fixed-sized array in memory that contains data of the same type, such as integers or floating point values.
An array class in Numpy is called as ndarray. Elements in Numpy arrays are accessed by using square brackets and can be initialized by using nested Python Lists.
The most important object defined in NumPy is an N-dimensional array type called ndarray. It describes the collection of items of the same type. Items in the collection can be accessed using a zero-based index. Every item in an ndarray takes the same size of block in the memory.
I am not sure about fft
, but np.log10
is a ufunc. The following page explains how the output type of a ufunc is determined: http://docs.scipy.org/doc/numpy/reference/ufuncs.html#output-type-determination
It wouldn't surprise me if fft
always returned an ndarray
though (I haven't looked at the source code, but the FFT clearly doesn't fit the definition of a ufunc). If that's the case, you can always write your own wrapper and call that instead.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With