User guide
NumPy User Guide, Release 1.9.0
# type(obj) is InfoArray
#
# Note that it is here, rather than in the __new__ method,
# that we set the default value for ’info’, because this
# method sees all creation of default objects - with the
# InfoArray.__new__ constructor, but also with
# arr.view(InfoArray).
self.info = getattr(obj, ’info’, None)
# We do not need to return anything
Using the object looks like this:
>>> obj = InfoArray(shape=(3,)) # explicit constructor
>>> type(obj)
<class ’InfoArray’>
>>> obj.info is None
True
>>> obj = InfoArray(shape=(3,), info=’information’)
>>> obj.info
’information’
>>> v = obj[1:] # new-from-template - here - slicing
>>> type(v)
<class ’InfoArray’>
>>> v.info
’information’
>>> arr = np.arange(10)
>>> cast_arr = arr.view(InfoArray) # view casting
>>> type(cast_arr)
<class ’InfoArray’>
>>> cast_arr.info is None
True
This class isn’t very useful, because it has the same constructor as the bare ndarray object, including passing in buffers
and shapes and so on. We would probably prefer the constructor to be able to take an already formed ndarray from the
usual numpy calls to np.array and return an object.
2.8.8 Slightly more realistic example - attribute added to existing array
Here is a class that takes a standard ndarray that already exists, casts as our type, and adds an extra attribute.
import numpy as np
class RealisticInfoArray(np.ndarray):
def __new__(cls, input_array, info=None):
# Input array is an already formed ndarray instance
# We first cast to be our class type
obj = np.asarray(input_array).view(cls)
# add the new attribute to the created instance
obj.info = info
# Finally, we must return the newly created object:
return obj
def __array_finalize__(self, obj):
# see InfoArray.__array_finalize__ for comments
if obj is None: return
self.info = getattr(obj, ’info’, None)
40 Chapter 2. Numpy basics