[pypy-commit] pypy default: fix numpy.maximum/minimum on nans

bdkearns noreply at buildbot.pypy.org
Wed Apr 30 20:29:26 CEST 2014


Author: Brian Kearns <bdkearns at gmail.com>
Branch: 
Changeset: r71097:c691b2acd560
Date: 2014-04-30 14:24 -0400
http://bitbucket.org/pypy/pypy/changeset/c691b2acd560/

Log:	fix numpy.maximum/minimum on nans

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
@@ -310,7 +310,7 @@
             assert math.isnan(fmod(v, 2))
 
     def test_minimum(self):
-        from numpypy import array, minimum
+        from numpypy import array, minimum, nan, isnan
 
         a = array([-5.0, -0.0, 1.0])
         b = array([ 3.0, -2.0,-3.0])
@@ -318,8 +318,12 @@
         for i in range(3):
             assert c[i] == min(a[i], b[i])
 
+        arg1 = array([0, nan, nan])
+        arg2 = array([nan, 0, nan])
+        assert isnan(minimum(arg1, arg2)).all()
+
     def test_maximum(self):
-        from numpypy import array, maximum
+        from numpypy import array, maximum, nan, isnan
 
         a = array([-5.0, -0.0, 1.0])
         b = array([ 3.0, -2.0,-3.0])
@@ -327,6 +331,10 @@
         for i in range(3):
             assert c[i] == max(a[i], b[i])
 
+        arg1 = array([0, nan, nan])
+        arg2 = array([nan, 0, nan])
+        assert isnan(maximum(arg1, arg2)).all()
+
         x = maximum(2, 3)
         assert x == 3
         assert isinstance(x, (int, long))
diff --git a/pypy/module/micronumpy/types.py b/pypy/module/micronumpy/types.py
--- a/pypy/module/micronumpy/types.py
+++ b/pypy/module/micronumpy/types.py
@@ -705,20 +705,20 @@
         return math.fabs(v)
 
     @simple_binary_op
+    def max(self, v1, v2):
+        return v1 if v1 >= v2 or rfloat.isnan(v1) else v2
+
+    @simple_binary_op
+    def min(self, v1, v2):
+        return v1 if v1 <= v2 or rfloat.isnan(v1) else v2
+
+    @simple_binary_op
     def fmax(self, v1, v2):
-        if rfloat.isnan(v2):
-            return v1
-        elif rfloat.isnan(v1):
-            return v2
-        return max(v1, v2)
+        return v1 if v1 >= v2 or rfloat.isnan(v2) else v2
 
     @simple_binary_op
     def fmin(self, v1, v2):
-        if rfloat.isnan(v2):
-            return v1
-        elif rfloat.isnan(v1):
-            return v2
-        return min(v1, v2)
+        return v1 if v1 <= v2 or rfloat.isnan(v2) else v2
 
     @simple_binary_op
     def fmod(self, v1, v2):


More information about the pypy-commit mailing list