[Numpy-discussion] strange multiplication behavior with numpy.float64 and ndarray subclass

Darren Dale dsdale24 at gmail.com
Sun Mar 8 18:42:56 EDT 2009


On Sun, Mar 8, 2009 at 12:31 PM, Darren Dale <dsdale24 at gmail.com> wrote:

> On Wed, Jan 21, 2009 at 12:43 PM, Pierre GM <pgmdevlist at gmail.com> wrote:
>
>>
>> On Jan 21, 2009, at 11:34 AM, Darren Dale wrote:
>>
>> > I have a simple test script here that multiplies an ndarray subclass
>> > with another number. Can anyone help me understand why each of these
>> > combinations returns a new instance of MyArray:
>> >
>> > mine = MyArray()
>> > print type(np.float32(1)*mine)
>> > print type(mine*np.float32(1))
>> > print type(mine*np.float64(1))
>> > print type(1*mine)
>> > print type(mine*1)
>> >
>> > but this one returns a np.float64 instance?
>>
>> FYI, that's the same behavior as observed in ticket #826. A first
>> thread addressed that issue
>> http://www.mail-archive.com/numpy-discussion@scipy.org/msg13235.html
>> But so far, no answer has been suggested.
>> Any help welcome.
>
>
> I believe ticket #826 can be solved with the application of this patch:
>
>
> $ svn diff scalarmathmodule.c.src
> Index: scalarmathmodule.c.src
> ===================================================================
> --- scalarmathmodule.c.src      (revision 6566)
> +++ scalarmathmodule.c.src      (working copy)
> @@ -566,6 +566,10 @@
>          Py_DECREF(descr1);
>          return ret;
>      }
> +    else if (PyArray_GetPriority(a, PyArray_SUBTYPE_PRIORITY) > \
> +            PyArray_SUBTYPE_PRIORITY) {
> +        return -2;
> +    }
>      else if ((temp = PyArray_ScalarFromObject(a)) != NULL) {
>          int retval;
>          retval = _ at name@_convert_to_ctype(temp, arg1);
>
>
> I've run the unit tests and get the same results with and without the patch
> applied, but it solves the problem in my script and also the problem with
> masked arrays.


Here is a test for this patch, maybe issue #826 can be closed.

Index: numpy/core/tests/test_umath.py
===================================================================
--- numpy/core/tests/test_umath.py      (revision 6575)
+++ numpy/core/tests/test_umath.py      (working copy)
@@ -253,6 +253,17 @@
         self.failUnless(isinstance(x, with_wrap))
         assert_array_equal(x, np.array((1, 2, 3)))

+    def test_priority_with_scalar(self):
+        # test fix for bug #826:
+        class A(np.ndarray):
+            __array_priority__ = 10
+            def __new__(cls):
+                return np.asarray(1.0, 'float64').view(cls).copy()
+        a = A()
+        x = np.float64(1)*a
+        self.failUnless(isinstance(x, A))
+        assert_array_equal(x, np.array(1))
+
     def test_old_wrap(self):
         class with_wrap(object):
             def __array__(self):
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20090308/18b01d6d/attachment.html>


More information about the NumPy-Discussion mailing list