From d4e120d5c174b07bc4413d397b02a12b0d5591cc Mon Sep 17 00:00:00 2001 From: gfyoung Date: Sun, 7 Feb 2016 00:21:20 +0000 Subject: [PATCH] BUG: Enforce dtype for randint singletons Closes gh-7203. --- numpy/core/tests/test_mem_overlap.py | 4 ++-- numpy/random/mtrand/mtrand.pyx | 18 +++++++++--------- numpy/random/tests/test_random.py | 9 +++++++++ 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/numpy/core/tests/test_mem_overlap.py b/numpy/core/tests/test_mem_overlap.py index 82e66db5b798..5a1f6ac9804d 100644 --- a/numpy/core/tests/test_mem_overlap.py +++ b/numpy/core/tests/test_mem_overlap.py @@ -116,9 +116,9 @@ def test_diophantine_fuzz(): A_max = min(max_int, A_max) U_max = min(max_int-1, U_max) - A = tuple(rng.randint(1, A_max+1, dtype=np.intp) + A = tuple(int(rng.randint(1, A_max+1, dtype=np.intp)) for j in range(ndim)) - U = tuple(rng.randint(0, U_max+2, dtype=np.intp) + U = tuple(int(rng.randint(0, U_max+2, dtype=np.intp)) for j in range(ndim)) b_ub = min(max_int-2, sum(a*ub for a, ub in zip(A, U))) diff --git a/numpy/random/mtrand/mtrand.pyx b/numpy/random/mtrand/mtrand.pyx index c8738cf6f5f3..8f7dd1dc4249 100644 --- a/numpy/random/mtrand/mtrand.pyx +++ b/numpy/random/mtrand/mtrand.pyx @@ -612,7 +612,7 @@ def _rand_bool(low, high, size, rngstate): off = (low) if size is None: rk_random_bool(off, rng, 1, &buf, state) - return buf + return np.bool_(buf) else: array = np.empty(size, np.bool_) cnt = PyArray_SIZE(array) @@ -639,7 +639,7 @@ def _rand_int8(low, high, size, rngstate): off = (low) if size is None: rk_random_uint8(off, rng, 1, &buf, state) - return buf + return np.int8(buf) else: array = np.empty(size, np.int8) cnt = PyArray_SIZE(array) @@ -666,7 +666,7 @@ def _rand_int16(low, high, size, rngstate): off = (low) if size is None: rk_random_uint16(off, rng, 1, &buf, state) - return buf + return np.int16(buf) else: array = np.empty(size, np.int16) cnt = PyArray_SIZE(array) @@ -717,7 +717,7 @@ def _rand_int32(low, high, size, rngstate): off = (low) if size is None: rk_random_uint32(off, rng, 1, &buf, state) - return buf + return np.int32(buf) else: array = np.empty(size, np.int32) cnt = PyArray_SIZE(array) @@ -744,7 +744,7 @@ def _rand_int64(low, high, size, rngstate): off = (low) if size is None: rk_random_uint64(off, rng, 1, &buf, state) - return buf + return np.int64(buf) else: array = np.empty(size, np.int64) cnt = PyArray_SIZE(array) @@ -770,7 +770,7 @@ def _rand_uint8(low, high, size, rngstate): off = (low) if size is None: rk_random_uint8(off, rng, 1, &buf, state) - return buf + return np.uint8(buf) else: array = np.empty(size, np.uint8) cnt = PyArray_SIZE(array) @@ -797,7 +797,7 @@ def _rand_uint16(low, high, size, rngstate): off = (low) if size is None: rk_random_uint16(off, rng, 1, &buf, state) - return buf + return np.uint16(buf) else: array = np.empty(size, np.uint16) cnt = PyArray_SIZE(array) @@ -824,7 +824,7 @@ def _rand_uint32(low, high, size, rngstate): off = (low) if size is None: rk_random_uint32(off, rng, 1, &buf, state) - return buf + return np.uint32(buf) else: array = np.empty(size, np.uint32) cnt = PyArray_SIZE(array) @@ -851,7 +851,7 @@ def _rand_uint64(low, high, size, rngstate): off = (low) if size is None: rk_random_uint64(off, rng, 1, &buf, state) - return buf + return np.uint64(buf) else: array = np.empty(size, np.uint64) cnt = PyArray_SIZE(array) diff --git a/numpy/random/tests/test_random.py b/numpy/random/tests/test_random.py index 96aa3790f4d4..7710f39ddfbc 100644 --- a/numpy/random/tests/test_random.py +++ b/numpy/random/tests/test_random.py @@ -209,6 +209,15 @@ def test_repeatability(self): res = hashlib.md5(val).hexdigest() assert_(tgt[np.dtype(np.bool).name] == res) + def test_respect_dtype_singleton(self): + # See gh-7203 + for dt in self.itype: + lbnd = 0 if dt is np.bool else np.iinfo(dt).min + ubnd = 2 if dt is np.bool else np.iinfo(dt).max + 1 + + sample = self.rfunc(lbnd, ubnd, dtype=dt) + self.assertEqual(sample.dtype, np.dtype(dt)) + class TestRandomDist(TestCase): # Make sure the random distribution returns the correct value for a