[Numpy-discussion] __array_priority__ ignored if __array__ is present

Frédéric Bastien nouiz at nouiz.org
Thu May 16 09:58:12 EDT 2013


I looked yesterday rapidly in the code and didn't find the reason (I don't
know it well, that is probably why).

But last night I think of one possible cause. I found this code 2 times in
the file core/src/umath/ufunc_object.c:

    if (nin == 2 && nout == 1 && dtypes[1]->type_num == NPY_OBJECT) {
        PyObject *_obj = PyTuple_GET_ITEM(args, 1);
        if (!PyArray_CheckExact(_obj)) {
            double self_prio, other_prio;
            self_prio = PyArray_GetPriority(PyTuple_GET_ITEM(args, 0),

NPY_SCALAR_PRIORITY);
            other_prio = PyArray_GetPriority(_obj, NPY_SCALAR_PRIORITY);
            if (self_prio < other_prio &&
                            _has_reflected_op(_obj, ufunc_name)) {
                retval = -2;
        goto fail;
            }
    }
    }

It is this code that will call _has_reflected_op() function. The if
condition is:

dtypes[1]->type_num == NPY_OBJECT


I wouldn't be surprised if dtypes[1] isn't NPY_OBJECT when you implement
__array__.

dtypes is set with those line:

    retval = ufunc->type_resolver(ufunc, casting,
                            op, type_tup, dtypes);


HTH

Fred



On Thu, May 16, 2013 at 9:19 AM, Thomas Robitaille <
thomas.robitaille at gmail.com> wrote:

> Hi everyone,
>
> (this was posted as part of another topic, but since it was unrelated,
> I'm reposting as a separate thread)
>
> I've also been having issues with __array_priority__ - the following
> code behaves differently for __mul__ and __rmul__:
>
> """
> import numpy as np
>
>
> class TestClass(object):
>
>     def __init__(self, input_array):
>         self.array = input_array
>
>     def __mul__(self, other):
>         print "Called __mul__"
>
>     def __rmul__(self, other):
>         print "Called __rmul__"
>
>     def __array_wrap__(self, out_arr, context=None):
>         print "Called __array_wrap__"
>         return TestClass(out_arr)
>
>     def __array__(self):
>         print "Called __array__"
>         return np.array(self.array)
> """
>
> with output:
>
> """
> In [7]: a = TestClass([1,2,3])
>
> In [8]: print type(np.array([1,2,3]) * a)
> Called __array__
> Called __array_wrap__
> <class '__main__.TestClass'>
>
> In [9]: print type(a * np.array([1,2,3]))
> Called __mul__
> <type 'NoneType'>
> """
>
> Is this also an oversight? I opened a ticket for it a little while ago:
>
> https://github.com/numpy/numpy/issues/3164
>
> Any ideas?
>
> Thanks!
> Tom
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion at scipy.org
> http://mail.scipy.org/mailman/listinfo/numpy-discussion
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20130516/5dacc2ba/attachment.html>


More information about the NumPy-Discussion mailing list