diff options
author | Julian Taylor <jtaylor.debian@googlemail.com> | 2017-09-01 13:40:07 +0200 |
---|---|---|
committer | Charles Harris <charlesr.harris@gmail.com> | 2017-09-24 16:00:44 -0600 |
commit | 40d91db07b0ddafeb27e799dd2e960698b2e1132 (patch) | |
tree | 5b143982eb5c1c256491b31dac0a1a338223bb8c | |
parent | 9b37f13ce5f533a58f370afbb43934645b7b2389 (diff) | |
download | numpy-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.py | 2 | ||||
-rw-r--r-- | numpy/core/tests/test_numeric.py | 28 |
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)), |