On Thu, Aug 13, 2015 at 7:59 AM, Nathan Goldbaum <nathan12...@gmail.com>
wrote:

>
>
> On Thu, Aug 13, 2015 at 9:44 AM, Charles R Harris <
> charlesr.har...@gmail.com> wrote:
>
>>
>>
>> On Thu, Aug 13, 2015 at 12:09 AM, Jaime Fernández del Río <
>> jaime.f...@gmail.com> wrote:
>>
>>> On Wed, Aug 12, 2015 at 2:03 PM, Nathan Goldbaum <nathan12...@gmail.com>
>>> wrote:
>>>
>>>> Hi all,
>>>>
>>>> I've been testing the package I spend most of my time on, yt, under
>>>> numpy 1.10b1 since the announcement went out.
>>>>
>>>> I think I've narrowed down and fixed all of the test failures that
>>>> cropped up except for one last issue. It seems that the behavior of
>>>> np.digitize with respect to ndarray subclasses has changed since the NumPy
>>>> 1.9 series. Consider the following test script:
>>>>
>>>> ```python
>>>> import numpy as np
>>>>
>>>>
>>>> class MyArray(np.ndarray):
>>>>     def __new__(cls, *args, **kwargs):
>>>>         return np.ndarray.__new__(cls, *args, **kwargs)
>>>>
>>>> data = np.arange(100)
>>>>
>>>> bins = np.arange(100) + 0.5
>>>>
>>>> data = data.view(MyArray)
>>>>
>>>> bins = bins.view(MyArray)
>>>>
>>>> digits = np.digitize(data, bins)
>>>>
>>>> print type(digits)
>>>> ```
>>>>
>>>> Under NumPy 1.9.2, this prints "<type 'numpy.ndarray'>", but under the
>>>> 1.10 beta, it prints "<class '__main__.MyArray'>"
>>>>
>>>> I'm curious why this change was made. Since digitize outputs index
>>>> arrays, it doesn't make sense to me why it should return anything but a
>>>> plain ndarray. I see in the release notes that digitize now uses
>>>> searchsorted under the hood. Is this related?
>>>>
>>>
>>> It is indeed searchsorted's fault, as it returns an object of the same
>>> type as the needle (the items to search for):
>>>
>>> >>> import numpy as np
>>> >>> class A(np.ndarray): pass
>>> >>> class B(np.ndarray): pass
>>> >>> np.arange(10).view(A).searchsorted(np.arange(5).view(B))
>>> B([0, 1, 2, 3, 4])
>>>
>>> I am all for making index-returning functions always return a base
>>> ndarray, and will be more than happy to send a PR fixing this if there is
>>> some agreement.
>>>
>>
>> I think that is the right thing to do.
>>
>
> Awesome, I'd appreciate having a PR to fix this. Arguably the return type
> *could* be the same type as the inputs, but given that it's a behavior
> change I agree that it's best to add a patch so the output of serachsorted
> is "sanitized" to be an ndarray before it's returned by digitize.
>

It is relatively simple to do, just replace Py_TYPE(ap2) with &PyArray_Type
in this line:

https://github.com/numpy/numpy/blob/maintenance/1.10.x/numpy/core/src/multiarray/item_selection.c#L1725

Then fix all the tests that are expecting searchsorted to return something
else than a base ndarray. We already have modified nonzero to return base
ndarray's in this release, see the release notes, so it will go with the
same theme.

For 1.11 I think we should try to extend this "if it returns an index, it
will be a base ndarray" to all other functions that don't right now. Then
sit back and watch AstroPy come down in flames... ;-)))

Seriously, I think this makes a lot of sense, and should be documented as
the way NumPy handles index arrays.

Anyway, I will try to find time tonight to put this PR together, unless
someone beats me to it, which I would be totally fine with.

Jaime


>
> To answer Nathaniel's question, I opened an issue on yt's bitbucket page
> to record the test failures:
>
>
> https://bitbucket.org/yt_analysis/yt/issues/1063/new-test-failures-using-numpy-110-beta
>
> I've fixed two of the classes of errors in that bug in yt itself, since it
> looks like we were relying on buggy or deprecated behavior in NumPy. Here
> are the PRs for those fixes:
>
>
> https://bitbucket.org/yt_analysis/yt/pull-requests/1697/cast-enzo-grid-start-index-to-int-arrays/diff
>
> https://bitbucket.org/yt_analysis/yt/pull-requests/1696/add-assert_allclose_units-like/diff
>
>>
>> Chuck
>>
>>
>> _______________________________________________
>> NumPy-Discussion mailing list
>> NumPy-Discussion@scipy.org
>> http://mail.scipy.org/mailman/listinfo/numpy-discussion
>>
>>
>
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion@scipy.org
> http://mail.scipy.org/mailman/listinfo/numpy-discussion
>
>


-- 
(\__/)
( O.o)
( > <) Este es Conejo. Copia a Conejo en tu firma y ayúdale en sus planes
de dominación mundial.
_______________________________________________
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion

Reply via email to