@@ -2428,15 +2428,15 @@ def __numpy_ufunc__(self, ufunc, method, i, inputs, **kw):
2428
2428
return "ufunc"
2429
2429
else :
2430
2430
inputs = list (inputs )
2431
- inputs [i ] = np .asarray (self )
2431
+ if i < len (inputs ):
2432
+ inputs [i ] = np .asarray (self )
2432
2433
func = getattr (ufunc , method )
2434
+ if ('out' in kw ) and (kw ['out' ] is not None ):
2435
+ kw ['out' ] = np .asarray (kw ['out' ])
2433
2436
r = func (* inputs , ** kw )
2434
- if 'out' in kw :
2435
- return r
2436
- else :
2437
- x = self .__class__ (r .shape , dtype = r .dtype )
2438
- x [...] = r
2439
- return x
2437
+ x = self .__class__ (r .shape , dtype = r .dtype )
2438
+ x [...] = r
2439
+ return x
2440
2440
2441
2441
class SomeClass3 (SomeClass2 ):
2442
2442
def __rsub__ (self , other ):
@@ -2520,6 +2520,64 @@ def __numpy_ufunc__(self, ufunc, method, i, inputs, **kw):
2520
2520
assert_ ('sig' not in kw and 'signature' in kw )
2521
2521
assert_equal (kw ['signature' ], 'ii->i' )
2522
2522
2523
+ def test_numpy_ufunc_index (self ):
2524
+ # Check that index is set appropriately, also if only an output
2525
+ # is passed on (latter is another regression tests for github bug 4753)
2526
+ class CheckIndex (object ):
2527
+ def __numpy_ufunc__ (self , ufunc , method , i , inputs , ** kw ):
2528
+ return i
2529
+
2530
+ a = CheckIndex ()
2531
+ dummy = np .arange (2. )
2532
+ # 1 input, 1 output
2533
+ assert_equal (np .sin (a ), 0 )
2534
+ assert_equal (np .sin (dummy , a ), 1 )
2535
+ assert_equal (np .sin (dummy , out = a ), 1 )
2536
+ assert_equal (np .sin (dummy , out = (a ,)), 1 )
2537
+ assert_equal (np .sin (a , a ), 0 )
2538
+ assert_equal (np .sin (a , out = a ), 0 )
2539
+ assert_equal (np .sin (a , out = (a ,)), 0 )
2540
+ # 1 input, 2 outputs
2541
+ assert_equal (np .modf (dummy , a ), 1 )
2542
+ assert_equal (np .modf (dummy , None , a ), 2 )
2543
+ assert_equal (np .modf (dummy , dummy , a ), 2 )
2544
+ assert_equal (np .modf (dummy , out = a ), 1 )
2545
+ assert_equal (np .modf (dummy , out = (a ,)), 1 )
2546
+ assert_equal (np .modf (dummy , out = (a , None )), 1 )
2547
+ assert_equal (np .modf (dummy , out = (a , dummy )), 1 )
2548
+ assert_equal (np .modf (dummy , out = (None , a )), 2 )
2549
+ assert_equal (np .modf (dummy , out = (dummy , a )), 2 )
2550
+ assert_equal (np .modf (a , out = (dummy , a )), 0 )
2551
+ # 2 inputs, 1 output
2552
+ assert_equal (np .add (a , dummy ), 0 )
2553
+ assert_equal (np .add (dummy , a ), 1 )
2554
+ assert_equal (np .add (dummy , dummy , a ), 2 )
2555
+ assert_equal (np .add (dummy , a , a ), 1 )
2556
+ assert_equal (np .add (dummy , dummy , out = a ), 2 )
2557
+ assert_equal (np .add (dummy , dummy , out = (a ,)), 2 )
2558
+ assert_equal (np .add (a , dummy , out = a ), 0 )
2559
+
2560
+ def test_out_override (self ):
2561
+ # regression test for github bug 4753
2562
+ class OutClass (ndarray ):
2563
+ def __numpy_ufunc__ (self , ufunc , method , i , inputs , ** kw ):
2564
+ if 'out' in kw :
2565
+ tmp_kw = kw .copy ()
2566
+ tmp_kw .pop ('out' )
2567
+ func = getattr (ufunc , method )
2568
+ kw ['out' ][...] = func (* inputs , ** tmp_kw )
2569
+
2570
+ A = np .array ([0 ]).view (OutClass )
2571
+ B = np .array ([5 ])
2572
+ C = np .array ([6 ])
2573
+ np .multiply (C , B , A )
2574
+ assert_equal (A [0 ], 30 )
2575
+ assert_ (isinstance (A , OutClass ))
2576
+ A [0 ] = 0
2577
+ np .multiply (C , B , out = A )
2578
+ assert_equal (A [0 ], 30 )
2579
+ assert_ (isinstance (A , OutClass ))
2580
+
2523
2581
2524
2582
class TestCAPI (TestCase ):
2525
2583
def test_IsPythonScalar (self ):
0 commit comments