On Tue, Jan 26, 2016 at 10:27 AM, Solbrig,Jeremy <
jeremy.solb...@colostate.edu> wrote:

> Hello Chuck,
>
> I receive the same result with 1.10.4.  I agree that it looks like
> __array_prepare__, __array_finalize__, and __array_wrap__ have not been
> changed.  I’m starting to dig into the source again, but focusing on the
> _MaskedBinaryOperation class to try to understand what is going on there.
>
> Jeremy
>
> From: NumPy-Discussion <numpy-discussion-boun...@scipy.org> on behalf of
> Charles R Harris <charlesr.har...@gmail.com>
> Reply-To: Discussion of Numerical Python <numpy-discussion@scipy.org>
> Date: Tuesday, January 26, 2016 at 10:17 AM
> To: Discussion of Numerical Python <numpy-discussion@scipy.org>
> Subject: Re: [Numpy-discussion] Inconsistent behavior for ufuncs in numpy
> v1.10.X
>
>
>
> On Tue, Jan 26, 2016 at 10:11 AM, Charles R Harris <
> charlesr.har...@gmail.com> wrote:
>
>>
>>
>> On Mon, Jan 25, 2016 at 10:43 PM, Solbrig,Jeremy <
>> jeremy.solb...@colostate.edu> wrote:
>>
>>> Hello,
>>>
>>> Much of what is below was copied from this stack overflow question.
>>>
>>> <http://stackoverflow.com/questions/35005569/behavior-of-ufuncs-and-mathematical-operators-differ-for-subclassed-maskedarray>
>>>
>>> I am attempting to subclass numpy.ma.MaskedArray.  I am currently using
>>> Python v2.7.10.  The problem discussed below does not occur in Numpy
>>> v1.9.2, but does occur in all versions of Numpy v1.10.x.
>>>
>>> In all versions of Numpy v1.10.x, using mathematical operators on my
>>> subclass behaves differently than using the analogous ufunc. When using the
>>> ufunc directly (e.g. np.subtract(arr1, arr2)), __array_prepare__,
>>> __array_finalize__, and __array_wrap__ are all called as expected, however,
>>> when using the symbolic operator (e.g. arr1-arr2) only
>>> __array_finalize__ is called. As a consequence, I lose any information
>>> stored in arr._optinfo when a mathematical operator is used.
>>>
>>> Here is a code snippet that illustrates the issue.
>>>
>>> #!/bin/env pythonimport numpy as npfrom numpy.ma import MaskedArray, nomask
>>> class InfoArray(MaskedArray):
>>>     def __new__(cls, info=None, data=None, mask=nomask, dtype=None,
>>>                 copy=False, subok=True, ndmin=0, fill_value=None,
>>>                 keep_mask=True, hard_mask=None, shrink=True, **kwargs):
>>>         obj = super(InfoArray, cls).__new__(cls, data=data, mask=mask,
>>>                       dtype=dtype, copy=copy, subok=subok, ndmin=ndmin,
>>>                       fill_value=fill_value, hard_mask=hard_mask,
>>>                       shrink=shrink, **kwargs)
>>>         obj._optinfo['info'] = info
>>>         return obj
>>>
>>>     def __array_prepare__(self, out, context=None):
>>>         print '__array_prepare__'
>>>         return super(InfoArray, self).__array_prepare__(out, context)
>>>
>>>     def __array_wrap__(self, out, context=None):
>>>         print '__array_wrap__'
>>>         return super(InfoArray, self).__array_wrap__(out, context)
>>>
>>>     def __array_finalize__(self, obj):
>>>         print '__array_finalize__'
>>>         return super(InfoArray, self).__array_finalize__(obj)if __name__ == 
>>> "__main__":
>>>     arr1 = InfoArray('test', data=[1,2,3,4,5,6])
>>>     arr2 = InfoArray(data=[0,1,2,3,4,5])
>>>
>>>     diff1 = np.subtract(arr1, arr2)
>>>     print diff1._optinfo
>>>
>>>     diff2 = arr1-arr2
>>>     print diff2._optinfo
>>>
>>> If run, the output looks like this:
>>>
>>> $ python test_ma_sub.py #Call to np.subtract(arr1, arr2) here
>>> __array_finalize__
>>> __array_finalize__
>>> __array_prepare__
>>> __array_finalize__
>>> __array_wrap__
>>> __array_finalize__{'info': 'test'}#Executing arr1-arr2 here
>>> __array_finalize__{}
>>>
>>> Currently I have simply downgraded to 1.9.2 to solve the problem for
>>> myself, but have been having difficulty figuring out where the difference
>>> lies between 1.9.2 and 1.10.0.
>>>
>>
>> I don't see a difference between 1.9.2 and 1.10.0 in this test, so I
>> suspect it is something else. Could you try 1.10.4 to see if the something
>> else has been fixed?
>>
>
> Which is to say, it isn't in the calls to prepare, wrap, and finalize. Now
> to look in _optinfo.
>
>
Please open an issue on github, the mailing list is not a good place to
deal with this. I've got a bisect script running, so we should soon know
where the change occurred.

Chuck
_______________________________________________
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
https://mail.scipy.org/mailman/listinfo/numpy-discussion

Reply via email to