[pypy-commit] pypy numpy-exp: (michaelh) add min & max ufuncs, together with ufunc2 decorator

fijal noreply at buildbot.pypy.org
Mon May 16 23:24:30 CEST 2011


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: numpy-exp
Changeset: r44221:ee7788d5c792
Date: 2011-05-16 23:33 +0200
http://bitbucket.org/pypy/pypy/changeset/ee7788d5c792/

Log:	(michaelh) add min & max ufuncs, together with ufunc2 decorator

diff --git a/pypy/module/micronumpy/__init__.py b/pypy/module/micronumpy/__init__.py
--- a/pypy/module/micronumpy/__init__.py
+++ b/pypy/module/micronumpy/__init__.py
@@ -12,6 +12,8 @@
         # ufuncs
         'absolute': 'interp_ufuncs.absolute',
         'negative': 'interp_ufuncs.negative',
+        'minimum': 'interp_ufuncs.minimum',
+        'maximum': 'interp_ufuncs.maximum',
     }
 
     appleveldefs = {}
diff --git a/pypy/module/micronumpy/interp_ufuncs.py b/pypy/module/micronumpy/interp_ufuncs.py
--- a/pypy/module/micronumpy/interp_ufuncs.py
+++ b/pypy/module/micronumpy/interp_ufuncs.py
@@ -1,5 +1,5 @@
 from pypy.interpreter.gateway import unwrap_spec
-from pypy.module.micronumpy.interp_numarray import BaseArray, Call1, Signature
+from pypy.module.micronumpy.interp_numarray import BaseArray, Call1, Call2, Signature
 from pypy.tool.sourcetools import func_with_new_name
 
 
@@ -12,10 +12,29 @@
         return w_res
     return func_with_new_name(impl, "%s_dispatcher" % func.__name__)
 
+def ufunc2(func):
+    signature = Signature()
+    @unwrap_spec(larray=BaseArray, rarray=BaseArray)
+    def impl(space, larray, rarray):
+        new_sig = larray.signature.transition(signature)
+        w_res = Call2(func, larray, rarray, rarray.signature.transition(new_sig))
+        larray.invalidates.append(w_res)
+        rarray.invalidates.append(w_res)
+        return w_res
+    return func_with_new_name(impl, "%s_dispatcher" % func.__name__)
+
 @ufunc
 def negative(value):
     return -value
 
 @ufunc
 def absolute(value):
-    return abs(value)
\ No newline at end of file
+    return abs(value)
+
+ at ufunc2
+def minimum(lvalue, rvalue):
+    return min(lvalue, rvalue)
+
+ at ufunc2
+def maximum(lvalue, rvalue):
+    return max(lvalue, rvalue)
diff --git a/pypy/module/micronumpy/test/test_ufuncs.py b/pypy/module/micronumpy/test/test_ufuncs.py
--- a/pypy/module/micronumpy/test/test_ufuncs.py
+++ b/pypy/module/micronumpy/test/test_ufuncs.py
@@ -21,4 +21,22 @@
         a = array([-5.0, -0.0, 1.0])
         b = absolute(a)
         for i in range(3):
-            assert b[i] == abs(a[i])
\ No newline at end of file
+            assert b[i] == abs(a[i])
+
+    def test_minimum(self):
+        from numpy import array, minimum
+
+        a = array([-5.0, -0.0, 1.0])
+        b = array([ 3.0, -2.0,-3.0])
+        c = minimum(a, b)
+        for i in range(3):
+            assert c[i] == min(a[i], b[i])
+
+    def test_maximum(self):
+        from numpy import array, maximum
+
+        a = array([-5.0, -0.0, 1.0])
+        b = array([ 3.0, -2.0,-3.0])
+        c = maximum(a, b)
+        for i in range(3):
+            assert c[i] == max(a[i], b[i])


More information about the pypy-commit mailing list