On 7/23/06, Eric Firing <[EMAIL PROTECTED]> wrote: > Sebastian Haase wrote: > > Hi, > > I have a (medical) image file. > > I wrote a nice interface based on memmap using numarray. > > The class design I used was essentially to return a numarray array > > object with a new "custom" attribute giving access to special > > information about the base file. > > > > Now with numpy I noticed that a numpy object does not allow adding new > > attributes !! (How is this ? Why ?) > > > > Travis already suggested (replying to one of my last postings) to create > > a new sub class of numpy.ndarray. > > > > But how do I initialize an object of my new class to be "basically > > identically to" an existing ndarray object ? > > Normally I could do > > class B(N.ndarray): > > pass > > a=N.arange(10) > > a.__class__ = B > > Isn't this what you need to do instead? > > In [1]:import numpy as N > > In [2]:class B(N.ndarray): > ...: pass > ...: > > In [3]:a = B(N.arange(10))
It won't work like that. The constructor for the ndarray is: | ndarray.__new__(subtype, shape=, dtype=int_, buffer=None, | offset=0, strides=None, fortran=False) so you will get either an exception caused by inappropriate shape value or completely wrong result. >>> numpy.ndarray([1,2]) array([[10966528, 18946344]]) >>> numpy.ndarray([1,2]).shape (1, 2) >>> numpy.ndarray(numpy.arange(5)) array([], shape=(0, 1, 2, 3, 4), dtype=int32) And this is a thing you souldn't do rather than a bug. To create an instance of ndarray's subclass B from ndarray object, one need to call the ndarray.view method or the ndarray.__new__ constructor explicitly: class B(numpy.ndarray): def __new__(subtype, data): if isinstance(data, B): return data if isinstance(data, numpy.ndarray): return data.view(subtype) arr = numpy.array(data) return numpy.ndarray.__new__(B, shape=arr.shape, dtype=arr.dtype, buffer=arr) A good example of subclasing ndarray is the matrix class in core/defmatrix.py (SVN version). cheers, fw ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys -- and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ Numpy-discussion mailing list Numpy-discussion@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/numpy-discussion