[Numpy-discussion] __array_wrap__

Robert Kern robert.kern@gmail....
Tue Sep 29 13:23:14 CDT 2009


On Tue, Sep 29, 2009 at 13:09, Charles R Harris
<charlesr.harris@gmail.com> wrote:
>
>
> On Tue, Sep 29, 2009 at 11:00 AM, Neal Becker <ndbecker2@gmail.com> wrote:
>>
>> fixed_pt arrays need to apply the overflow_policy after operations
>> (overflow_policy could be clip, or throw exception).
>>
>> I thought __array_wrap__ would work for this, but it seems to not be
>> called
>> when I need it.  For example:
>>
>> In [13]: obj
>> Out[13]: fixed_pt_array([  0,  32,  64,  96, 128])
>>
>> In [14]: obj*100 < this should overflow
>> enter: [  0  32  64  96 128] << on entry into __array_wrap
>> enter: [0 32 64 96 128]
>> exit: [  0  32  64  96 128]
>> Out[14]: fixed_pt_array([    0,  3200,  6400,  9600, 12800])
>>
>> Apparantly, obj*100 is never passed to array_wrap.
>>
>> Is there another way I can do this?
>>
> I believe array wrap has to be explicitly called after the fact.

Ufuncs call __array_wrap__ implicitly.

In [22]: class myarray(np.ndarray):
   ....:     def __array_wrap__(self, *args):
   ....:         print 'myarray.__array_wrap__%r' % (args,)
   ....:         return super(myarray, self).__array_wrap__(*args)
   ....:
   ....:

In [25]: m = np.arange(10).view(myarray)

In [26]: m * 100
myarray.__array_wrap__(myarray([  0, 100, 200, 300, 400, 500, 600,
700, 800, 900]), (<ufunc 'multiply'>, (myarray([0, 1, 2, 3, 4, 5, 6,
7, 8, 9]), 100), 0))
Out[26]: myarray([  0, 100, 200, 300, 400, 500, 600, 700, 800, 900])


-- 
Robert Kern

"I have come to believe that the whole world is an enigma, a harmless
enigma that is made terrible by our own mad attempt to interpret it as
though it had an underlying truth."
  -- Umberto Eco


More information about the NumPy-Discussion mailing list