[NumPy-Tickets] [NumPy] #2089: Wrong method resolution for `multiply` & other arithmetic ufuncs

NumPy Trac numpy-tickets@scipy....
Thu Mar 22 05:58:37 CDT 2012


#2089: Wrong method resolution for `multiply` & other arithmetic ufuncs
------------------------+---------------------------------------------------
 Reporter:  pv          |       Owner:  somebody   
     Type:  defect      |      Status:  new        
 Priority:  high        |   Milestone:  Unscheduled
Component:  numpy.core  |     Version:  1.6.1      
 Keywords:              |  
------------------------+---------------------------------------------------
 `multiply` and the other arithmetic ufuncs fall back to `PyNumber_*`
 methods before trying `obj.<ufunc_name>` methods.

 This is problematic for sparse matrices and matrices:
 {{{
 import numpy as np
 import scipy.sparse as sp
 A = sp.rand(20,20,density=0.1)
 B = sp.rand(20,20,density=0.1)
 print (np.multiply(A,B) - A.dot(B)).todense().max()
 # out: 0.0
 }}}
 So, `multiply` actually calls the matrix multiply.

 The reason seems to be that in
 `numpy/core/code_generators/generate_umath.py` for these ufuncs the
 resolution ends with:
 {{{
         TD(O, f='PyNumber_Multiply'),
 }}}
 which ends up calling `__mul__`. The fix could be to change this to
 {{{
         TD(O, f='NPy_ElementwiseMultiply'),
 }}}
 which would try to call `multiply` before falling back to `PyNumber_*`.

-- 
Ticket URL: <http://projects.scipy.org/numpy/ticket/2089>
NumPy <http://projects.scipy.org/numpy>
My example project


More information about the NumPy-Tickets mailing list