summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Taylor <jtaylor.debian@googlemail.com>2017-09-01 13:40:07 +0200
committerCharles Harris <charlesr.harris@gmail.com>2017-09-24 16:00:44 -0600
commit40d91db07b0ddafeb27e799dd2e960698b2e1132 (patch)
tree5b143982eb5c1c256491b31dac0a1a338223bb8c
parent9b37f13ce5f533a58f370afbb43934645b7b2389 (diff)
downloadnumpy-40d91db07b0ddafeb27e799dd2e960698b2e1132.tar.gz
BUG: ensure consistent result dtype of count_nonzero
The slowpath using apply_along_axis for size 1 axis did not ensure that the dtype is intp like all other paths. This caused inconsistent dtypes on windows where the default integer type is int32. Closes gh-9468
-rw-r--r--numpy/core/numeric.py2
-rw-r--r--numpy/core/tests/test_numeric.py28
2 files changed, 17 insertions, 13 deletions
diff --git a/numpy/core/numeric.py b/numpy/core/numeric.py
index 6b4a93ce0..6b1c6e86e 100644
--- a/numpy/core/numeric.py
+++ b/numpy/core/numeric.py
@@ -445,7 +445,7 @@ def count_nonzero(a, axis=None):
counts = np.apply_along_axis(multiarray.count_nonzero, axis[0], a)
if axis.size == 1:
- return counts
+ return counts.astype(np.intp, copy=False)
else:
# for subsequent axis numbers, that number decreases
# by one in this new 'counts' array if it was larger
diff --git a/numpy/core/tests/test_numeric.py b/numpy/core/tests/test_numeric.py
index 70469b72b..311acd5f9 100644
--- a/numpy/core/tests/test_numeric.py
+++ b/numpy/core/tests/test_numeric.py
@@ -1020,6 +1020,10 @@ class TestNonzero(TestCase):
# either integer or tuple arguments for axis
msg = "Mismatch for dtype: %s"
+ def assert_equal_w_dt(a, b, err_msg):
+ assert_equal(a.dtype, b.dtype, err_msg=err_msg)
+ assert_equal(a, b, err_msg=err_msg)
+
for dt in np.typecodes['All']:
err_msg = msg % (np.dtype(dt).name,)
@@ -1039,13 +1043,13 @@ class TestNonzero(TestCase):
m[1, 0] = '1970-01-12'
m = m.astype(dt)
- expected = np.array([2, 0, 0])
- assert_equal(np.count_nonzero(m, axis=0),
- expected, err_msg=err_msg)
+ expected = np.array([2, 0, 0], dtype=np.intp)
+ assert_equal_w_dt(np.count_nonzero(m, axis=0),
+ expected, err_msg=err_msg)
- expected = np.array([1, 1, 0])
- assert_equal(np.count_nonzero(m, axis=1),
- expected, err_msg=err_msg)
+ expected = np.array([1, 1, 0], dtype=np.intp)
+ assert_equal_w_dt(np.count_nonzero(m, axis=1),
+ expected, err_msg=err_msg)
expected = np.array(2)
assert_equal(np.count_nonzero(m, axis=(0, 1)),
@@ -1060,13 +1064,13 @@ class TestNonzero(TestCase):
# setup is slightly different for this dtype
m = np.array([np.void(1)] * 6).reshape((2, 3))
- expected = np.array([0, 0, 0])
- assert_equal(np.count_nonzero(m, axis=0),
- expected, err_msg=err_msg)
+ expected = np.array([0, 0, 0], dtype=np.intp)
+ assert_equal_w_dt(np.count_nonzero(m, axis=0),
+ expected, err_msg=err_msg)
- expected = np.array([0, 0])
- assert_equal(np.count_nonzero(m, axis=1),
- expected, err_msg=err_msg)
+ expected = np.array([0, 0], dtype=np.intp)
+ assert_equal_w_dt(np.count_nonzero(m, axis=1),
+ expected, err_msg=err_msg)
expected = np.array(0)
assert_equal(np.count_nonzero(m, axis=(0, 1)),