Hi Christiaan On Sun, Apr 15, 2007 at 02:03:49PM +0900, Christian K wrote: > could someone please provide example code for how to make a subclassed ndarray > pickable? I don't quite understand the docs of ndarray.__reduce__. > My subclassed ndarray has just one additional attribute. >
__reduce__ is part of the pickle protocol, which is described at http://docs.python.org/lib/node321.html You need to modify __reduce__ to store the complete state of your custom object, as well as __setstate__ which restores the state on unpickling. See the attached code as an example. There, I have an InfoArray, which is a subclassed numpy.ndarray. The InfoArray contains an additional member, info, which is a dictionary. The __reduce__ method calls ndarray's __reduce__, then adds to the result the state of the InfoArray. Conversely, the __setstate__ method calls ndarray's __setstate__ as well as restoring the info member. Regards Stéfan
import numpy as N class InfoArray(N.ndarray): def __new__(subtype, data, dtype=None, info=None, copy=False): subtype.__defaultinfo = info if copy: data = N.array(data,dtype=dtype) else: data = N.asarray(data,dtype=dtype) data = data.view(subtype) return data def __array_finalize__(self,obj): if not hasattr(self, "info"): # The object does not already have an `.info` attribute: we use the default self.info = getattr(obj,'info',self.__defaultinfo) def __reduce__(self): object_state = list(N.ndarray.__reduce__(self)) subclass_state = (self.info,) object_state[2] = (object_state[2],subclass_state) return tuple(object_state) def __setstate__(self,state): nd_state, own_state = state N.ndarray.__setstate__(self,nd_state) info, = own_state self.info = info def __repr__(self): desc="""\ array(data= %(data)s, tag=%(tag)s)""" return desc % {'data': str(self), 'tag':self.info } import numpy as N x = InfoArray(N.arange(10), info={'name':'x'}) print repr(x) y = InfoArray(N.arange(10), info={'name':'y'}) assert (x.info['name']=='x') assert (y.info['name']=='y') z = N.sqrt(x) print repr(z) # -- demonstrate that instance of subclass can be pickled -- import pickle print "\n\nBefore pickling:" print repr(z) jar = pickle.dumps(z) z = pickle.loads(jar) print "\n\nAfter pickling:" print repr(z)
_______________________________________________ Numpy-discussion mailing list [EMAIL PROTECTED] http://projects.scipy.org/mailman/listinfo/numpy-discussion