[Numpy-discussion] ndarray subclassing
Travis E. Oliphant
oliphant at enthought.com
Thu May 1 00:45:02 EDT 2008
ctw wrote:
> Hi!
>
> I ran into some strange (at least to me) issues with sublasses of
> ndarray. The following minimal class definition illustrates the
> problem:
>
> ====================================================
>
> import numpy as np
> class TestArray(np.ndarray):
> def __new__(cls, data, info=None, dtype=None, copy=False):
> subarr = np.array(data, dtype=dtype, copy=copy)
> subarr = subarr.view(cls)
> return subarr
>
> def __array_finalize__(self,obj):
> print "self: ",self.shape
> print "obj: ",obj.shape
>
> =====================================================
>
> When I run this code interactively with IPython and then generate
> TestArray instances, __array_finalize__ seems to get called when
> printing out arrays with more than 1 dimension and self.shape seems to
> drop a dimension. Everything works fine if the array has just 1
> dimension:
>
> In [3]: x = TestArray(np.arange(5))
> self: (5,)
> obj: (5,)
>
> In [4]: x
> Out[4]: TestArray([0, 1, 2, 3, 4])
>
> This is all expected behavior.
> However things change when the array is 2-D:
>
> In [5]: x = TestArray(np.zeros((2,3)))
> self: (2, 3)
> obj: (2, 3)
>
> In [6]: x
> Out[6]: self: (3,)
> obj: (2, 3)
> self: (3,)
> obj: (2, 3)
>
> TestArray([[ 0., 0., 0.],
> [ 0., 0., 0.]])
>
You are just seeing the result of __repr__. The printing code works by
accessing slices of the array. These slices create new instances of
your TestArray class which have a smaller number of dimensions. That's all.
Is the printing code causing you other kinds of problems?
-Travis
More information about the NumPy-Discussion
mailing list