[Numpy-discussion] Setter on array

Christian K. ckkart at hoc.net
Fri Aug 16 08:33:38 EDT 2013


Hi Hugo,

Am 14.08.13 10:34, schrieb Hugo Gagnon:
> What is the best way, if any, to "do something" whenever array elements
> are changed in-place?  For example, if I have a = arange(10), then
> setting a[3] = 1 would, say, call a function automatically.

a one made a simple subclass of ndarray which takes a callback argument 
and which should do exactly what you are asking for. I am not an expert 
so you might want to try to understand the concerns mentioned in the 
other answers.

class cbarray(N.ndarray):
     def __new__(subtype, data, cb=None, dtype=None, copy=False):
         subtype.__defaultcb = cb

         if copy:
             data = N.array(data,dtype=dtype)
         else:
             data = N.asarray(data,dtype=dtype)

         data = data.view(subtype)
         return data

     def _notify(self):
         if self.cb is not None:
             self.cb()

     def _get_shape(self):
         return super(cbarray, self).shape
     shape = property(_get_shape)

     def __setitem__(self, item, val):
         N.ndarray.__setitem__(self, item, val)
         self._notify()

     def __array_finalize__(self,obj):
         if not hasattr(self, "cb"):
             # The object does not yet have a `.cb` attribute
             self.cb = getattr(obj,'cb',self.__defaultcb)

     def __reduce__(self):
         object_state = list(N.ndarray.__reduce__(self))
         subclass_state = (self.cb,)
         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)

         cb, = own_state
         self.cb = cb


Regards, Christian





More information about the NumPy-Discussion mailing list