User guide

NumPy User Guide, Release 1.9.0
So:
>>> arr = np.arange(5)
>>> obj = RealisticInfoArray(arr, info=’information’)
>>> type(obj)
<class ’RealisticInfoArray’>
>>> obj.info
’information’
>>> v = obj[1:]
>>> type(v)
<class ’RealisticInfoArray’>
>>> v.info
’information’
2.8.9 __array_wrap__ for ufuncs
__array_wrap__ gets called at the end of numpy ufuncs and other numpy functions, to allow a subclass to set the
type of the return value and update attributes and metadata. Let’s show how this works with an example. First we
make the same subclass as above, but with a different name and some print statements:
import numpy as np
class MySubClass(np.ndarray):
def __new__(cls, input_array, info=None):
obj = np.asarray(input_array).view(cls)
obj.info = info
return obj
def __array_finalize__(self, obj):
print ’In __array_finalize__:’
print self is %s % repr(self)
print obj is %s % repr(obj)
if obj is None: return
self.info = getattr(obj, ’info’, None)
def __array_wrap__(self, out_arr, context=None):
print ’In __array_wrap__:’
print self is %s % repr(self)
print arr is %s % repr(out_arr)
# then just call the parent
return np.ndarray.__array_wrap__(self, out_arr, context)
We run a ufunc on an instance of our new array:
>>> obj = MySubClass(np.arange(5), info=’spam’)
In __array_finalize__:
self is MySubClass([0, 1, 2, 3, 4])
obj is array([0, 1, 2, 3, 4])
>>> arr2 = np.arange(5)+1
>>> ret = np.add(arr2, obj)
In __array_wrap__:
self is MySubClass([0, 1, 2, 3, 4])
arr is array([1, 3, 5, 7, 9])
In __array_finalize__:
self is MySubClass([1, 3, 5, 7, 9])
obj is MySubClass([0, 1, 2, 3, 4])
>>> ret
2.8. Subclassing ndarray 41