summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Sheppard <kevin.k.sheppard@gmail.com>2019-04-08 10:11:07 +0100
committermattip <matti.picus@gmail.com>2019-05-20 18:45:27 +0300
commit7e8e19f9a3b452fdbd992568348b393c31fba005 (patch)
tree663fb54dce4ae97ce434a21fab1e9e449a4e0ec7
parentfa8af41c9d375072b2c7af66e5f7f01df4754841 (diff)
downloadnumpy-7e8e19f9a3b452fdbd992568348b393c31fba005.tar.gz
BUG: Correct handling of nans
Improve consistency of nan handling Prevent nans prducing values from int functions Add tests to ensure guards work Synchronize with randomgen Remove comments no longer relevant
-rw-r--r--.circleci/config.yml2
-rw-r--r--doc/source/reference/randomgen/new-or-different.rst2
-rw-r--r--numpy/random/randomgen/common.pyx3
-rw-r--r--numpy/random/randomgen/tests/test_direct.py6
-rw-r--r--numpy/random/randomgen/tests/test_generator_mt19937.py127
-rw-r--r--numpy/random/randomgen/tests/test_randomstate.py241
6 files changed, 235 insertions, 146 deletions
diff --git a/.circleci/config.yml b/.circleci/config.yml
index 2a3d82677..e7fbf55fe 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -20,7 +20,7 @@ jobs:
command: |
python3 -m venv venv
. venv/bin/activate
- pip install cython sphinx==1.8.5 matplotlib
+ pip install cython sphinx>=1.8.5 matplotlib ipython
sudo apt-get update
sudo apt-get install -y graphviz texlive-fonts-recommended texlive-latex-recommended texlive-latex-extra texlive-generic-extra latexmk texlive-xetex
diff --git a/doc/source/reference/randomgen/new-or-different.rst b/doc/source/reference/randomgen/new-or-different.rst
index 6598c13fe..0a27b9aa1 100644
--- a/doc/source/reference/randomgen/new-or-different.rst
+++ b/doc/source/reference/randomgen/new-or-different.rst
@@ -35,7 +35,7 @@ What's New or Different
.. ipython:: python
- from randomgen import Xoroshiro128
+ from numpy.random.randomgen import Xoroshiro128
import numpy.random
rg = Xoroshiro128().generator
%timeit rg.standard_normal(100000)
diff --git a/numpy/random/randomgen/common.pyx b/numpy/random/randomgen/common.pyx
index 1f7cd40ca..ebd2e60d1 100644
--- a/numpy/random/randomgen/common.pyx
+++ b/numpy/random/randomgen/common.pyx
@@ -337,6 +337,9 @@ cdef int check_constraint(double val, object name, constraint_type cons) except
elif cons == CONS_BOUNDED_0_1:
if not (val >= 0) or not (val <= 1):
raise ValueError("{0} < 0 , {0} > 1 or {0} is NaN".format(name))
+ elif cons == CONS_BOUNDED_GT_0_1:
+ if not val >0 or not val <= 1:
+ raise ValueError("{0} <= 0 , {0} > 1 or {0} contains NaNs".format(name))
elif cons == CONS_GT_1:
if not (val > 1):
raise ValueError("{0} <= 1 or {0} is NaN".format(name))
diff --git a/numpy/random/randomgen/tests/test_direct.py b/numpy/random/randomgen/tests/test_direct.py
index 6e856de41..22fdcd865 100644
--- a/numpy/random/randomgen/tests/test_direct.py
+++ b/numpy/random/randomgen/tests/test_direct.py
@@ -233,14 +233,14 @@ class Base(object):
def test_repr(self):
rs = RandomGenerator(self.brng(*self.data1['seed']))
- assert 'RandomGenerator' in rs.__repr__()
- assert str(hex(id(rs)))[2:].upper() in rs.__repr__()
+ assert 'RandomGenerator' in repr(rs)
+ assert '{:#x}'.format(id(rs)).upper().replace('X', 'x') in repr(rs)
def test_str(self):
rs = RandomGenerator(self.brng(*self.data1['seed']))
assert 'RandomGenerator' in str(rs)
assert str(self.brng.__name__) in str(rs)
- assert str(hex(id(rs)))[2:].upper() not in str(rs)
+ assert '{:#x}'.format(id(rs)).upper().replace('X', 'x') not in str(rs)
def test_generator(self):
brng = self.brng(*self.data1['seed'])
diff --git a/numpy/random/randomgen/tests/test_generator_mt19937.py b/numpy/random/randomgen/tests/test_generator_mt19937.py
index cad3ef4d6..10dd8733a 100644
--- a/numpy/random/randomgen/tests/test_generator_mt19937.py
+++ b/numpy/random/randomgen/tests/test_generator_mt19937.py
@@ -53,8 +53,7 @@ class TestBinomial(object):
# This test addresses issue #3480.
zeros = np.zeros(2, dtype='int')
for p in [0, .5, 1]:
- val = random.binomial(0, p)
- assert val == 0
+ assert_(random.binomial(0, p) == 0)
assert_array_equal(random.binomial(zeros, p), zeros)
def test_p_is_nan(self):
@@ -96,40 +95,40 @@ class TestMultinomial(object):
class TestSetState(object):
def setup(self):
self.seed = 1234567890
- self.brng = RandomGenerator(MT19937(self.seed))
- self.state = self.brng.state
+ self.rg = RandomGenerator(MT19937(self.seed))
+ self.state = self.rg.state
self.legacy_state = (self.state['brng'],
self.state['state']['key'],
self.state['state']['pos'])
def test_basic(self):
- old = self.brng.tomaxint(16)
- self.brng.state = self.state
- new = self.brng.tomaxint(16)
+ old = self.rg.tomaxint(16)
+ self.rg.state = self.state
+ new = self.rg.tomaxint(16)
assert_(np.all(old == new))
def test_gaussian_reset(self):
# Make sure the cached every-other-Gaussian is reset.
- old = self.brng.standard_normal(size=3)
- self.brng.state = self.state
- new = self.brng.standard_normal(size=3)
+ old = self.rg.standard_normal(size=3)
+ self.rg.state = self.state
+ new = self.rg.standard_normal(size=3)
assert_(np.all(old == new))
def test_gaussian_reset_in_media_res(self):
# When the state is saved with a cached Gaussian, make sure the
# cached Gaussian is restored.
- self.brng.standard_normal()
- state = self.brng.state
- old = self.brng.standard_normal(size=3)
- self.brng.state = state
- new = self.brng.standard_normal(size=3)
+ self.rg.standard_normal()
+ state = self.rg.state
+ old = self.rg.standard_normal(size=3)
+ self.rg.state = state
+ new = self.rg.standard_normal(size=3)
assert_(np.all(old == new))
def test_negative_binomial(self):
# Ensure that the negative binomial results take floating point
# arguments without truncation.
- self.brng.negative_binomial(0.5, 0.5)
+ self.rg.negative_binomial(0.5, 0.5)
class TestRandint(object):
@@ -554,8 +553,7 @@ class TestRandomDist(object):
def test_choice_nonuniform_noreplace(self):
random.seed(self.seed)
- actual = random.choice(4, 3, replace=False,
- p=[0.1, 0.3, 0.5, 0.1])
+ actual = random.choice(4, 3, replace=False, p=[0.1, 0.3, 0.5, 0.1])
desired = np.array([2, 3, 1])
assert_array_equal(actual, desired)
@@ -614,11 +612,11 @@ class TestRandomDist(object):
# Check multi dimensional array
s = (2, 3)
p = [0.1, 0.1, 0.1, 0.1, 0.4, 0.2]
- assert_(random.choice(6, s, replace=True).shape, s)
- assert_(random.choice(6, s, replace=False).shape, s)
- assert_(random.choice(6, s, replace=True, p=p).shape, s)
- assert_(random.choice(6, s, replace=False, p=p).shape, s)
- assert_(random.choice(np.arange(6), s, replace=True).shape, s)
+ assert_equal(random.choice(6, s, replace=True).shape, s)
+ assert_equal(random.choice(6, s, replace=False).shape, s)
+ assert_equal(random.choice(6, s, replace=True, p=p).shape, s)
+ assert_equal(random.choice(6, s, replace=False, p=p).shape, s)
+ assert_equal(random.choice(np.arange(6), s, replace=True).shape, s)
# Check zero-size
assert_equal(random.randint(0, 0, size=(3, 0, 4)).shape, (3, 0, 4))
@@ -711,6 +709,11 @@ class TestRandomDist(object):
[46, 45]])
assert_array_equal(actual, desired)
+ random.seed(self.seed)
+ actual = random.binomial(100.123, .456)
+ desired = 37
+ assert_array_equal(actual, desired)
+
def test_chisquare(self):
random.seed(self.seed)
actual = random.chisquare(50, size=(3, 2))
@@ -795,6 +798,16 @@ class TestRandomDist(object):
[5, 12]])
assert_array_equal(actual, desired)
+ def test_geometric_exceptions(self):
+ assert_raises(ValueError, random.geometric, 1.1)
+ assert_raises(ValueError, random.geometric, [1.1] * 10)
+ assert_raises(ValueError, random.geometric, -0.1)
+ assert_raises(ValueError, random.geometric, [-0.1] * 10)
+ with suppress_warnings() as sup:
+ sup.record(RuntimeWarning)
+ assert_raises(ValueError, random.geometric, np.nan)
+ assert_raises(ValueError, random.geometric, [np.nan] * 10)
+
def test_gumbel(self):
random.seed(self.seed)
actual = random.gumbel(loc=.123456789, scale=2.0, size=(3, 2))
@@ -873,6 +886,12 @@ class TestRandomDist(object):
[3, 6]])
assert_array_equal(actual, desired)
+ def test_logseries_exceptions(self):
+ with suppress_warnings() as sup:
+ sup.record(RuntimeWarning)
+ assert_raises(ValueError, random.logseries, np.nan)
+ assert_raises(ValueError, random.logseries, [np.nan] * 10)
+
def test_multinomial(self):
random.seed(self.seed)
actual = random.multinomial(20, [1 / 6.] * 6, size=(3, 2))
@@ -943,6 +962,13 @@ class TestRandomDist(object):
[723, 751]])
assert_array_equal(actual, desired)
+ def test_negative_binomial_exceptions(self):
+ with suppress_warnings() as sup:
+ sup.record(RuntimeWarning)
+ assert_raises(ValueError, random.negative_binomial, 100, np.nan)
+ assert_raises(ValueError, random.negative_binomial, 100,
+ [np.nan] * 10)
+
def test_noncentral_chisquare(self):
random.seed(self.seed)
actual = random.noncentral_chisquare(df=5, nonc=5, size=(3, 2))
@@ -973,6 +999,11 @@ class TestRandomDist(object):
[1.16362730891403, 2.54104276581491]])
assert_array_almost_equal(actual, desired, decimal=14)
+ def test_noncentral_f_nan(self):
+ random.seed(self.seed)
+ actual = random.noncentral_f(dfnum=5, dfden=2, nonc=np.nan)
+ assert np.isnan(actual)
+
def test_normal(self):
random.seed(self.seed)
actual = random.normal(loc=.123456789, scale=2.0, size=(3, 2))
@@ -993,7 +1024,7 @@ class TestRandomDist(object):
[1.1281132447159091e+01, 3.1895968171107006e+08]])
# For some reason on 32-bit x86 Ubuntu 12.10 the [1, 0] entry in this
# matrix differs by 24 nulps. Discussion:
- # http://mail.scipy.org/pipermail/numpy-discussion/2012-September/063801.html
+ # https://mail.python.org/pipermail/numpy-discussion/2012-September/063801.html
# Consensus is that this is probably some gcc quirk that affects
# rounding but not in any important way, so we just use a looser
# tolerance on this test:
@@ -1014,6 +1045,10 @@ class TestRandomDist(object):
assert_raises(ValueError, random.poisson, [lamneg] * 10)
assert_raises(ValueError, random.poisson, lambig)
assert_raises(ValueError, random.poisson, [lambig] * 10)
+ with suppress_warnings() as sup:
+ sup.record(RuntimeWarning)
+ assert_raises(ValueError, random.poisson, np.nan)
+ assert_raises(ValueError, random.poisson, [np.nan] * 10)
def test_power(self):
random.seed(self.seed)
@@ -1168,8 +1203,8 @@ class TestRandomDist(object):
raise TypeError
throwing_float = np.array(1.0).view(ThrowingFloat)
- assert_raises(TypeError, random.uniform,
- throwing_float, throwing_float)
+ assert_raises(TypeError, random.uniform, throwing_float,
+ throwing_float)
class ThrowingInteger(np.ndarray):
def __int__(self):
@@ -1189,9 +1224,14 @@ class TestRandomDist(object):
def test_vonmises_small(self):
# check infinite loop, gh-4720
random.seed(self.seed)
- r = random.vonmises(mu=0., kappa=1.1e-8, size=10 ** 6)
+ r = random.vonmises(mu=0., kappa=1.1e-8, size=10**6)
assert_(np.isfinite(r).all())
+ def test_vonmises_nan(self):
+ random.seed(self.seed)
+ r = random.vonmises(mu=0., kappa=np.nan)
+ assert_(np.isnan(r))
+
def test_wald(self):
random.seed(self.seed)
actual = random.wald(mean=1.23, scale=1.54, size=(3, 2))
@@ -1372,8 +1412,9 @@ class TestBroadcast(object):
self.set_seed()
actual = nonc_f(dfnum * 3, dfden, nonc)
- mt_nonc_f = random.noncentral_f
assert_array_almost_equal(actual, desired, decimal=14)
+ assert np.all(np.isnan(nonc_f(dfnum, dfden, [np.nan] * 3)))
+
assert_raises(ValueError, nonc_f, bad_dfnum * 3, dfden, nonc)
assert_raises(ValueError, nonc_f, dfnum * 3, bad_dfden, nonc)
assert_raises(ValueError, nonc_f, dfnum * 3, dfden, bad_nonc)
@@ -1391,9 +1432,12 @@ class TestBroadcast(object):
assert_raises(ValueError, nonc_f, bad_dfnum, dfden, nonc * 3)
assert_raises(ValueError, nonc_f, dfnum, bad_dfden, nonc * 3)
assert_raises(ValueError, nonc_f, dfnum, dfden, bad_nonc * 3)
- assert_raises(ValueError, mt_nonc_f, bad_dfnum, dfden, nonc * 3)
- assert_raises(ValueError, mt_nonc_f, dfnum, bad_dfden, nonc * 3)
- assert_raises(ValueError, mt_nonc_f, dfnum, dfden, bad_nonc * 3)
+
+ def test_noncentral_f_small_df(self):
+ self.set_seed()
+ desired = np.array([21.57878070681719, 1.17110217503908])
+ actual = random.noncentral_f(0.9, 0.9, 2, size=2)
+ assert_array_almost_equal(actual, desired, decimal=14)
def test_chisquare(self):
df = [1]
@@ -1420,20 +1464,15 @@ class TestBroadcast(object):
self.set_seed()
actual = nonc_chi(df * 3, nonc)
- mt_nonc_chi2 = random.noncentral_chisquare
assert_array_almost_equal(actual, desired, decimal=14)
assert_raises(ValueError, nonc_chi, bad_df * 3, nonc)
assert_raises(ValueError, nonc_chi, df * 3, bad_nonc)
- assert_raises(ValueError, mt_nonc_chi2, bad_df * 3, nonc)
- assert_raises(ValueError, mt_nonc_chi2, df * 3, bad_nonc)
self.set_seed()
actual = nonc_chi(df, nonc * 3)
assert_array_almost_equal(actual, desired, decimal=14)
assert_raises(ValueError, nonc_chi, bad_df, nonc * 3)
assert_raises(ValueError, nonc_chi, df, bad_nonc * 3)
- assert_raises(ValueError, mt_nonc_chi2, bad_df, nonc * 3)
- assert_raises(ValueError, mt_nonc_chi2, df, bad_nonc * 3)
def test_standard_t(self):
df = [1]
@@ -1645,24 +1684,24 @@ class TestBroadcast(object):
assert_array_almost_equal(actual, desired, decimal=14)
assert_raises(ValueError, triangular, bad_left_one * 3, mode, right)
assert_raises(ValueError, triangular, left * 3, bad_mode_one, right)
- assert_raises(ValueError, triangular,
- bad_left_two * 3, bad_mode_two, right)
+ assert_raises(ValueError, triangular, bad_left_two * 3, bad_mode_two,
+ right)
self.set_seed()
actual = triangular(left, mode * 3, right)
assert_array_almost_equal(actual, desired, decimal=14)
assert_raises(ValueError, triangular, bad_left_one, mode * 3, right)
assert_raises(ValueError, triangular, left, bad_mode_one * 3, right)
- assert_raises(ValueError, triangular, bad_left_two,
- bad_mode_two * 3, right)
+ assert_raises(ValueError, triangular, bad_left_two, bad_mode_two * 3,
+ right)
self.set_seed()
actual = triangular(left, mode, right * 3)
assert_array_almost_equal(actual, desired, decimal=14)
assert_raises(ValueError, triangular, bad_left_one, mode, right * 3)
assert_raises(ValueError, triangular, left, bad_mode_one, right * 3)
- assert_raises(ValueError, triangular, bad_left_two,
- bad_mode_two, right * 3)
+ assert_raises(ValueError, triangular, bad_left_two, bad_mode_two,
+ right * 3)
assert_raises(ValueError, triangular, 10., 0., 20.)
assert_raises(ValueError, triangular, 10., 25., 20.)
@@ -1739,6 +1778,9 @@ class TestBroadcast(object):
actual = zipf(a * 3)
assert_array_equal(actual, desired)
assert_raises(ValueError, zipf, bad_a * 3)
+ with np.errstate(invalid='ignore'):
+ assert_raises(ValueError, zipf, np.nan)
+ assert_raises(ValueError, zipf, [0, 0, np.nan])
def test_geometric(self):
p = [0.5]
@@ -1809,7 +1851,6 @@ class TestBroadcast(object):
class TestThread(object):
# make sure each state produces the same sequence even in threads
-
def setup(self):
self.seeds = range(4)
diff --git a/numpy/random/randomgen/tests/test_randomstate.py b/numpy/random/randomgen/tests/test_randomstate.py
index 167d1b0aa..6adde6c2a 100644
--- a/numpy/random/randomgen/tests/test_randomstate.py
+++ b/numpy/random/randomgen/tests/test_randomstate.py
@@ -109,7 +109,9 @@ class TestMultinomial(object):
assert_raises(TypeError, random.multinomial, 1, p,
float(1))
- assert_raises(ValueError, random.multinomial, 1, [1.1, .1])
+
+ def test_invalid_prob(self):
+ assert_raises(ValueError, random.multinomial, 100, [1.1, 0.2])
class TestSetState(object):
@@ -352,6 +354,12 @@ class TestRandomDist(object):
[0.4575674820298663, 0.7781880808593471]])
assert_array_almost_equal(actual, desired, decimal=15)
+ def test_rand_singleton(self):
+ random.seed(self.seed)
+ actual = random.rand()
+ desired = 0.61879477158567997
+ assert_array_almost_equal(actual, desired, decimal=15)
+
def test_randn(self):
random.seed(self.seed)
actual = random.randn(3, 2)
@@ -360,6 +368,10 @@ class TestRandomDist(object):
[2.031033998682787, 2.17032494605655257]])
assert_array_almost_equal(actual, desired, decimal=15)
+ random.seed(self.seed)
+ actual = random.randn()
+ assert_array_almost_equal(actual, desired[0, 0], decimal=15)
+
def test_randint(self):
random.seed(self.seed)
actual = random.randint(-99, 99, size=(3, 2))
@@ -443,11 +455,9 @@ class TestRandomDist(object):
[0.4575674820298663, 0.7781880808593471]])
assert_array_almost_equal(actual, desired, decimal=15)
- def test_rand_singleton(self):
random.seed(self.seed)
- actual = random.rand()
- desired = np.array(0.61879477158567997)
- assert_array_almost_equal(actual, desired, decimal=15)
+ actual = random.random_sample()
+ assert_array_almost_equal(actual, desired[0, 0], decimal=15)
def test_choice_uniform_replace(self):
random.seed(self.seed)
@@ -582,18 +592,6 @@ class TestRandomDist(object):
desired = conv([0, 1, 9, 6, 2, 4, 5, 8, 7, 3])
assert_array_equal(actual, desired)
- def test_permutation(self):
- random.seed(self.seed)
- alist = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
- actual = random.permutation(alist)
- desired = [0, 1, 9, 6, 2, 4, 5, 8, 7, 3]
- assert_array_equal(actual, desired)
-
- random.seed(self.seed)
- arr_2d = np.atleast_2d([1, 2, 3, 4, 5, 6, 7, 8, 9, 0]).T
- actual = random.permutation(arr_2d)
- assert_array_equal(actual, np.atleast_2d(desired).T)
-
def test_shuffle_masked(self):
# gh-3263
a = np.ma.masked_values(np.reshape(range(20), (5, 4)) % 3 - 1, -1)
@@ -608,6 +606,18 @@ class TestRandomDist(object):
assert_equal(
sorted(b.data[~b.mask]), sorted(b_orig.data[~b_orig.mask]))
+ def test_permutation(self):
+ random.seed(self.seed)
+ alist = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
+ actual = random.permutation(alist)
+ desired = [0, 1, 9, 6, 2, 4, 5, 8, 7, 3]
+ assert_array_equal(actual, desired)
+
+ random.seed(self.seed)
+ arr_2d = np.atleast_2d([1, 2, 3, 4, 5, 6, 7, 8, 9, 0]).T
+ actual = random.permutation(arr_2d)
+ assert_array_equal(actual, np.atleast_2d(desired).T)
+
def test_beta(self):
random.seed(self.seed)
actual = random.beta(.1, .9, size=(3, 2))
@@ -649,6 +659,8 @@ class TestRandomDist(object):
[[0.59266909280647828, 0.40733090719352177],
[0.56974431743975207, 0.43025568256024799]]])
assert_array_almost_equal(actual, desired, decimal=15)
+ bad_alpha = np.array([5.4e-01, -1.0e-16])
+ assert_raises(ValueError, random.dirichlet, bad_alpha)
random.seed(self.seed)
alpha = np.array([51.72840233779265162, 39.74494232180943953])
@@ -712,6 +724,16 @@ class TestRandomDist(object):
[5, 12]])
assert_array_equal(actual, desired)
+ def test_geometric_exceptions(self):
+ assert_raises(ValueError, random.geometric, 1.1)
+ assert_raises(ValueError, random.geometric, [1.1] * 10)
+ assert_raises(ValueError, random.geometric, -0.1)
+ assert_raises(ValueError, random.geometric, [-0.1] * 10)
+ with suppress_warnings() as sup:
+ sup.record(RuntimeWarning)
+ assert_raises(ValueError, random.geometric, np.nan)
+ assert_raises(ValueError, random.geometric, [np.nan] * 10)
+
def test_gumbel(self):
random.seed(self.seed)
actual = random.gumbel(loc=.123456789, scale=2.0, size=(3, 2))
@@ -790,9 +812,15 @@ class TestRandomDist(object):
[3, 6]])
assert_array_equal(actual, desired)
+ def test_logseries_exceptions(self):
+ with suppress_warnings() as sup:
+ sup.record(RuntimeWarning)
+ assert_raises(ValueError, random.logseries, np.nan)
+ assert_raises(ValueError, random.logseries, [np.nan] * 10)
+
def test_multinomial(self):
random.seed(self.seed)
- actual = random.multinomial(20, [1/6.]*6, size=(3, 2))
+ actual = random.multinomial(20, [1 / 6.] * 6, size=(3, 2))
desired = np.array([[[4, 3, 5, 4, 2, 2],
[5, 2, 8, 2, 2, 1]],
[[3, 4, 3, 6, 0, 4],
@@ -843,8 +871,8 @@ class TestRandomDist(object):
mu = np.zeros(2)
cov = np.eye(2)
- assert_raises(ValueError, random.multivariate_normal, mean,
- cov, check_valid='other')
+ assert_raises(ValueError, random.multivariate_normal, mean, cov,
+ check_valid='other')
assert_raises(ValueError, random.multivariate_normal,
np.zeros((2, 1, 1)), cov)
assert_raises(ValueError, random.multivariate_normal,
@@ -860,6 +888,13 @@ class TestRandomDist(object):
[779, 647]])
assert_array_equal(actual, desired)
+ def test_negative_binomial_exceptions(self):
+ with suppress_warnings() as sup:
+ sup.record(RuntimeWarning)
+ assert_raises(ValueError, random.negative_binomial, 100, np.nan)
+ assert_raises(ValueError, random.negative_binomial, 100,
+ [np.nan] * 10)
+
def test_noncentral_chisquare(self):
random.seed(self.seed)
actual = random.noncentral_chisquare(df=5, nonc=5, size=(3, 2))
@@ -890,6 +925,11 @@ class TestRandomDist(object):
[0.43741599463544162, 1.1774208752428319]])
assert_array_almost_equal(actual, desired, decimal=14)
+ def test_noncentral_f_nan(self):
+ random.seed(self.seed)
+ actual = random.noncentral_f(dfnum=5, dfden=2, nonc=np.nan)
+ assert np.isnan(actual)
+
def test_normal(self):
random.seed(self.seed)
actual = random.normal(loc=.123456789, scale=2.0, size=(3, 2))
@@ -929,9 +969,13 @@ class TestRandomDist(object):
lambig = np.iinfo('l').max
lamneg = -1
assert_raises(ValueError, random.poisson, lamneg)
- assert_raises(ValueError, random.poisson, [lamneg]*10)
+ assert_raises(ValueError, random.poisson, [lamneg] * 10)
assert_raises(ValueError, random.poisson, lambig)
- assert_raises(ValueError, random.poisson, [lambig]*10)
+ assert_raises(ValueError, random.poisson, [lambig] * 10)
+ with suppress_warnings() as sup:
+ sup.record(RuntimeWarning)
+ assert_raises(ValueError, random.poisson, np.nan)
+ assert_raises(ValueError, random.poisson, [np.nan] * 10)
def test_power(self):
random.seed(self.seed)
@@ -1026,8 +1070,8 @@ class TestRandomDist(object):
func = random.uniform
assert_raises(OverflowError, func, -np.inf, 0)
- assert_raises(OverflowError, func, 0, np.inf)
- assert_raises(OverflowError, func, fmin, fmax)
+ assert_raises(OverflowError, func, 0, np.inf)
+ assert_raises(OverflowError, func, fmin, fmax)
assert_raises(OverflowError, func, [-np.inf], [0])
assert_raises(OverflowError, func, [0], [np.inf])
@@ -1070,7 +1114,12 @@ class TestRandomDist(object):
# check infinite loop, gh-4720
random.seed(self.seed)
r = random.vonmises(mu=0., kappa=1.1e-8, size=10**6)
- np.testing.assert_(np.isfinite(r).all())
+ assert_(np.isfinite(r).all())
+
+ def test_vonmises_nan(self):
+ random.seed(self.seed)
+ r = random.vonmises(mu=0., kappa=np.nan)
+ assert_(np.isnan(r))
def test_wald(self):
random.seed(self.seed)
@@ -1108,12 +1157,9 @@ class TestBroadcast(object):
def setup(self):
self.seed = 123456789
- def setSeed(self):
+ def set_seed(self):
random.seed(self.seed)
- # TODO: Include test for randint once it can broadcast
- # Can steal the test written in PR #6938
-
def test_uniform(self):
low = [0]
high = [1]
@@ -1122,11 +1168,11 @@ class TestBroadcast(object):
0.53413660089041659,
0.50955303552646702])
- self.setSeed()
+ self.set_seed()
actual = uniform(low * 3, high)
assert_array_almost_equal(actual, desired, decimal=14)
- self.setSeed()
+ self.set_seed()
actual = uniform(low, high * 3)
assert_array_almost_equal(actual, desired, decimal=14)
@@ -1139,12 +1185,12 @@ class TestBroadcast(object):
2.1283977976520019,
1.8417114045748335])
- self.setSeed()
+ self.set_seed()
actual = normal(loc * 3, scale)
assert_array_almost_equal(actual, desired, decimal=14)
assert_raises(ValueError, normal, loc * 3, bad_scale)
- self.setSeed()
+ self.set_seed()
actual = normal(loc, scale * 3)
assert_array_almost_equal(actual, desired, decimal=14)
assert_raises(ValueError, normal, loc, bad_scale * 3)
@@ -1159,13 +1205,13 @@ class TestBroadcast(object):
0.075230336409423643,
0.24976865978980844])
- self.setSeed()
+ self.set_seed()
actual = beta(a * 3, b)
assert_array_almost_equal(actual, desired, decimal=14)
assert_raises(ValueError, beta, bad_a * 3, b)
assert_raises(ValueError, beta, a * 3, bad_b)
- self.setSeed()
+ self.set_seed()
actual = beta(a, b * 3)
assert_array_almost_equal(actual, desired, decimal=14)
assert_raises(ValueError, beta, bad_a, b * 3)
@@ -1179,7 +1225,7 @@ class TestBroadcast(object):
0.76386282278691653,
0.71243813125891797])
- self.setSeed()
+ self.set_seed()
actual = exponential(scale * 3)
assert_array_almost_equal(actual, desired, decimal=14)
assert_raises(ValueError, exponential, bad_scale * 3)
@@ -1192,7 +1238,7 @@ class TestBroadcast(object):
0.76386282278691653,
0.71243813125891797])
- self.setSeed()
+ self.set_seed()
actual = std_gamma(shape * 3)
assert_array_almost_equal(actual, desired, decimal=14)
assert_raises(ValueError, std_gamma, bad_shape * 3)
@@ -1207,13 +1253,13 @@ class TestBroadcast(object):
1.5277256455738331,
1.4248762625178359])
- self.setSeed()
+ self.set_seed()
actual = gamma(shape * 3, scale)
assert_array_almost_equal(actual, desired, decimal=14)
assert_raises(ValueError, gamma, bad_shape * 3, scale)
assert_raises(ValueError, gamma, shape * 3, bad_scale)
- self.setSeed()
+ self.set_seed()
actual = gamma(shape, scale * 3)
assert_array_almost_equal(actual, desired, decimal=14)
assert_raises(ValueError, gamma, bad_shape, scale * 3)
@@ -1229,13 +1275,13 @@ class TestBroadcast(object):
0.86768719635363512,
2.7251095168386801])
- self.setSeed()
+ self.set_seed()
actual = f(dfnum * 3, dfden)
assert_array_almost_equal(actual, desired, decimal=14)
assert_raises(ValueError, f, bad_dfnum * 3, dfden)
assert_raises(ValueError, f, dfnum * 3, bad_dfden)
- self.setSeed()
+ self.set_seed()
actual = f(dfnum, dfden * 3)
assert_array_almost_equal(actual, desired, decimal=14)
assert_raises(ValueError, f, bad_dfnum, dfden * 3)
@@ -1253,21 +1299,23 @@ class TestBroadcast(object):
13.025456344595602,
8.8018098359100545])
- self.setSeed()
+ self.set_seed()
actual = nonc_f(dfnum * 3, dfden, nonc)
assert_array_almost_equal(actual, desired, decimal=14)
+ assert np.all(np.isnan(nonc_f(dfnum, dfden, [np.nan] * 3)))
+
assert_raises(ValueError, nonc_f, bad_dfnum * 3, dfden, nonc)
assert_raises(ValueError, nonc_f, dfnum * 3, bad_dfden, nonc)
assert_raises(ValueError, nonc_f, dfnum * 3, dfden, bad_nonc)
- self.setSeed()
+ self.set_seed()
actual = nonc_f(dfnum, dfden * 3, nonc)
assert_array_almost_equal(actual, desired, decimal=14)
assert_raises(ValueError, nonc_f, bad_dfnum, dfden * 3, nonc)
assert_raises(ValueError, nonc_f, dfnum, bad_dfden * 3, nonc)
assert_raises(ValueError, nonc_f, dfnum, dfden * 3, bad_nonc)
- self.setSeed()
+ self.set_seed()
actual = nonc_f(dfnum, dfden, nonc * 3)
assert_array_almost_equal(actual, desired, decimal=14)
assert_raises(ValueError, nonc_f, bad_dfnum, dfden, nonc * 3)
@@ -1275,7 +1323,7 @@ class TestBroadcast(object):
assert_raises(ValueError, nonc_f, dfnum, dfden, bad_nonc * 3)
def test_noncentral_f_small_df(self):
- self.setSeed()
+ self.set_seed()
desired = np.array([6.869638627492048, 0.785880199263955])
actual = random.noncentral_f(0.9, 0.9, 2, size=2)
assert_array_almost_equal(actual, desired, decimal=14)
@@ -1288,7 +1336,7 @@ class TestBroadcast(object):
0.51947702108840776,
0.1320969254923558])
- self.setSeed()
+ self.set_seed()
actual = chisquare(df * 3)
assert_array_almost_equal(actual, desired, decimal=14)
assert_raises(ValueError, chisquare, bad_df * 3)
@@ -1303,13 +1351,13 @@ class TestBroadcast(object):
4.5804135049718742,
6.0872302432834564])
- self.setSeed()
+ self.set_seed()
actual = nonc_chi(df * 3, nonc)
assert_array_almost_equal(actual, desired, decimal=14)
assert_raises(ValueError, nonc_chi, bad_df * 3, nonc)
assert_raises(ValueError, nonc_chi, df * 3, bad_nonc)
- self.setSeed()
+ self.set_seed()
actual = nonc_chi(df, nonc * 3)
assert_array_almost_equal(actual, desired, decimal=14)
assert_raises(ValueError, nonc_chi, bad_df, nonc * 3)
@@ -1323,10 +1371,11 @@ class TestBroadcast(object):
5.8560725167361607,
1.0274791436474273])
- self.setSeed()
+ self.set_seed()
actual = t(df * 3)
assert_array_almost_equal(actual, desired, decimal=14)
assert_raises(ValueError, t, bad_df * 3)
+ assert_raises(ValueError, random.standard_t, bad_df * 3)
def test_vonmises(self):
mu = [2]
@@ -1337,12 +1386,12 @@ class TestBroadcast(object):
-2.7064099483995943,
-1.8672476700665914])
- self.setSeed()
+ self.set_seed()
actual = vonmises(mu * 3, kappa)
assert_array_almost_equal(actual, desired, decimal=14)
assert_raises(ValueError, vonmises, mu * 3, bad_kappa)
- self.setSeed()
+ self.set_seed()
actual = vonmises(mu, kappa * 3)
assert_array_almost_equal(actual, desired, decimal=14)
assert_raises(ValueError, vonmises, mu, bad_kappa * 3)
@@ -1355,10 +1404,11 @@ class TestBroadcast(object):
1.1465519762044529,
1.0389564467453547])
- self.setSeed()
+ self.set_seed()
actual = pareto(a * 3)
assert_array_almost_equal(actual, desired, decimal=14)
assert_raises(ValueError, pareto, bad_a * 3)
+ assert_raises(ValueError, random.pareto, bad_a * 3)
def test_weibull(self):
a = [1]
@@ -1368,10 +1418,11 @@ class TestBroadcast(object):
0.76386282278691653,
0.71243813125891797])
- self.setSeed()
+ self.set_seed()
actual = weibull(a * 3)
assert_array_almost_equal(actual, desired, decimal=14)
assert_raises(ValueError, weibull, bad_a * 3)
+ assert_raises(ValueError, random.weibull, bad_a * 3)
def test_power(self):
a = [1]
@@ -1381,10 +1432,11 @@ class TestBroadcast(object):
0.53413660089041659,
0.50955303552646702])
- self.setSeed()
+ self.set_seed()
actual = power(a * 3)
assert_array_almost_equal(actual, desired, decimal=14)
assert_raises(ValueError, power, bad_a * 3)
+ assert_raises(ValueError, random.power, bad_a * 3)
def test_laplace(self):
loc = [0]
@@ -1395,12 +1447,12 @@ class TestBroadcast(object):
0.070715642226971326,
0.019290950698972624])
- self.setSeed()
+ self.set_seed()
actual = laplace(loc * 3, scale)
assert_array_almost_equal(actual, desired, decimal=14)
assert_raises(ValueError, laplace, loc * 3, bad_scale)
- self.setSeed()
+ self.set_seed()
actual = laplace(loc, scale * 3)
assert_array_almost_equal(actual, desired, decimal=14)
assert_raises(ValueError, laplace, loc, bad_scale * 3)
@@ -1414,12 +1466,12 @@ class TestBroadcast(object):
0.26936705726291116,
0.33906220393037939])
- self.setSeed()
+ self.set_seed()
actual = gumbel(loc * 3, scale)
assert_array_almost_equal(actual, desired, decimal=14)
assert_raises(ValueError, gumbel, loc * 3, bad_scale)
- self.setSeed()
+ self.set_seed()
actual = gumbel(loc, scale * 3)
assert_array_almost_equal(actual, desired, decimal=14)
assert_raises(ValueError, gumbel, loc, bad_scale * 3)
@@ -1433,15 +1485,16 @@ class TestBroadcast(object):
0.13675915696285773,
0.038216792802833396])
- self.setSeed()
+ self.set_seed()
actual = logistic(loc * 3, scale)
assert_array_almost_equal(actual, desired, decimal=14)
assert_raises(ValueError, logistic, loc * 3, bad_scale)
- self.setSeed()
+ self.set_seed()
actual = logistic(loc, scale * 3)
assert_array_almost_equal(actual, desired, decimal=14)
assert_raises(ValueError, logistic, loc, bad_scale * 3)
+ assert_equal(random.logistic(1.0, 0.0), 1.0)
def test_lognormal(self):
mean = [0]
@@ -1452,15 +1505,17 @@ class TestBroadcast(object):
8.4013952870126261,
6.3073234116578671])
- self.setSeed()
+ self.set_seed()
actual = lognormal(mean * 3, sigma)
assert_array_almost_equal(actual, desired, decimal=14)
assert_raises(ValueError, lognormal, mean * 3, bad_sigma)
+ assert_raises(ValueError, random.lognormal, mean * 3, bad_sigma)
- self.setSeed()
+ self.set_seed()
actual = lognormal(mean, sigma * 3)
assert_array_almost_equal(actual, desired, decimal=14)
assert_raises(ValueError, lognormal, mean, bad_sigma * 3)
+ assert_raises(ValueError, random.lognormal, mean, bad_sigma * 3)
def test_rayleigh(self):
scale = [1]
@@ -1470,7 +1525,7 @@ class TestBroadcast(object):
1.2360119924878694,
1.1936818095781789])
- self.setSeed()
+ self.set_seed()
actual = rayleigh(scale * 3)
assert_array_almost_equal(actual, desired, decimal=14)
assert_raises(ValueError, rayleigh, bad_scale * 3)
@@ -1485,13 +1540,15 @@ class TestBroadcast(object):
0.12450084820795027,
0.9096122728408238])
- self.setSeed()
+ self.set_seed()
actual = wald(mean * 3, scale)
assert_array_almost_equal(actual, desired, decimal=14)
assert_raises(ValueError, wald, bad_mean * 3, scale)
assert_raises(ValueError, wald, mean * 3, bad_scale)
+ assert_raises(ValueError, random.wald, bad_mean * 3, scale)
+ assert_raises(ValueError, random.wald, mean * 3, bad_scale)
- self.setSeed()
+ self.set_seed()
actual = wald(mean, scale * 3)
assert_array_almost_equal(actual, desired, decimal=14)
assert_raises(ValueError, wald, bad_mean, scale * 3)
@@ -1511,7 +1568,7 @@ class TestBroadcast(object):
2.0347400359389356,
2.0095991069536208])
- self.setSeed()
+ self.set_seed()
actual = triangular(left * 3, mode, right)
assert_array_almost_equal(actual, desired, decimal=14)
assert_raises(ValueError, triangular, bad_left_one * 3, mode, right)
@@ -1519,7 +1576,7 @@ class TestBroadcast(object):
assert_raises(ValueError, triangular, bad_left_two * 3, bad_mode_two,
right)
- self.setSeed()
+ self.set_seed()
actual = triangular(left, mode * 3, right)
assert_array_almost_equal(actual, desired, decimal=14)
assert_raises(ValueError, triangular, bad_left_one, mode * 3, right)
@@ -1527,7 +1584,7 @@ class TestBroadcast(object):
assert_raises(ValueError, triangular, bad_left_two, bad_mode_two * 3,
right)
- self.setSeed()
+ self.set_seed()
actual = triangular(left, mode, right * 3)
assert_array_almost_equal(actual, desired, decimal=14)
assert_raises(ValueError, triangular, bad_left_one, mode, right * 3)
@@ -1548,14 +1605,14 @@ class TestBroadcast(object):
binom = random.binomial
desired = np.array([1, 1, 1])
- self.setSeed()
+ self.set_seed()
actual = binom(n * 3, p)
assert_array_equal(actual, desired)
assert_raises(ValueError, binom, bad_n * 3, p)
assert_raises(ValueError, binom, n * 3, bad_p_one)
assert_raises(ValueError, binom, n * 3, bad_p_two)
- self.setSeed()
+ self.set_seed()
actual = binom(n, p * 3)
assert_array_equal(actual, desired)
assert_raises(ValueError, binom, bad_n, p * 3)
@@ -1571,14 +1628,14 @@ class TestBroadcast(object):
neg_binom = random.negative_binomial
desired = np.array([1, 0, 1])
- self.setSeed()
+ self.set_seed()
actual = neg_binom(n * 3, p)
assert_array_equal(actual, desired)
assert_raises(ValueError, neg_binom, bad_n * 3, p)
assert_raises(ValueError, neg_binom, n * 3, bad_p_one)
assert_raises(ValueError, neg_binom, n * 3, bad_p_two)
- self.setSeed()
+ self.set_seed()
actual = neg_binom(n, p * 3)
assert_array_equal(actual, desired)
assert_raises(ValueError, neg_binom, bad_n, p * 3)
@@ -1594,7 +1651,7 @@ class TestBroadcast(object):
poisson = random.poisson
desired = np.array([1, 1, 0])
- self.setSeed()
+ self.set_seed()
actual = poisson(lam * 3)
assert_array_equal(actual, desired)
assert_raises(ValueError, poisson, bad_lam_one * 3)
@@ -1606,7 +1663,7 @@ class TestBroadcast(object):
zipf = random.zipf
desired = np.array([2, 2, 1])
- self.setSeed()
+ self.set_seed()
actual = zipf(a * 3)
assert_array_equal(actual, desired)
assert_raises(ValueError, zipf, bad_a * 3)
@@ -1621,7 +1678,7 @@ class TestBroadcast(object):
geom = random.geometric
desired = np.array([2, 2, 2])
- self.setSeed()
+ self.set_seed()
actual = geom(p * 3)
assert_array_equal(actual, desired)
assert_raises(ValueError, geom, bad_p_one * 3)
@@ -1638,7 +1695,7 @@ class TestBroadcast(object):
hypergeom = random.hypergeometric
desired = np.array([1, 1, 1])
- self.setSeed()
+ self.set_seed()
actual = hypergeom(ngood * 3, nbad, nsample)
assert_array_equal(actual, desired)
assert_raises(ValueError, hypergeom, bad_ngood * 3, nbad, nsample)
@@ -1646,7 +1703,7 @@ class TestBroadcast(object):
assert_raises(ValueError, hypergeom, ngood * 3, nbad, bad_nsample_one)
assert_raises(ValueError, hypergeom, ngood * 3, nbad, bad_nsample_two)
- self.setSeed()
+ self.set_seed()
actual = hypergeom(ngood, nbad * 3, nsample)
assert_array_equal(actual, desired)
assert_raises(ValueError, hypergeom, bad_ngood, nbad * 3, nsample)
@@ -1654,7 +1711,7 @@ class TestBroadcast(object):
assert_raises(ValueError, hypergeom, ngood, nbad * 3, bad_nsample_one)
assert_raises(ValueError, hypergeom, ngood, nbad * 3, bad_nsample_two)
- self.setSeed()
+ self.set_seed()
actual = hypergeom(ngood, nbad, nsample * 3)
assert_array_equal(actual, desired)
assert_raises(ValueError, hypergeom, bad_ngood, nbad, nsample * 3)
@@ -1662,6 +1719,9 @@ class TestBroadcast(object):
assert_raises(ValueError, hypergeom, ngood, nbad, bad_nsample_one * 3)
assert_raises(ValueError, hypergeom, ngood, nbad, bad_nsample_two * 3)
+ assert_raises(ValueError, hypergeom, -1, 10, 20)
+ assert_raises(ValueError, hypergeom, 10, -1, 20)
+ assert_raises(ValueError, hypergeom, 10, 10, 0)
assert_raises(ValueError, hypergeom, 10, 10, 25)
def test_logseries(self):
@@ -1671,7 +1731,7 @@ class TestBroadcast(object):
logseries = random.logseries
desired = np.array([1, 1, 1])
- self.setSeed()
+ self.set_seed()
actual = logseries(p * 3)
assert_array_equal(actual, desired)
assert_raises(ValueError, logseries, bad_p_one * 3)
@@ -1708,16 +1768,19 @@ class TestThread(object):
def test_normal(self):
def gen_random(state, out):
out[...] = state.normal(size=10000)
+
self.check_function(gen_random, sz=(10000,))
def test_exp(self):
def gen_random(state, out):
out[...] = state.exponential(scale=np.ones((100, 1000)))
+
self.check_function(gen_random, sz=(100, 1000))
def test_multinomial(self):
def gen_random(state, out):
- out[...] = state.multinomial(10, [1/6.]*6, size=10000)
+ out[...] = state.multinomial(10, [1 / 6.] * 6, size=10000)
+
self.check_function(gen_random, sz=(10000, 6))
@@ -1775,24 +1838,6 @@ class TestSingleEltArrayInput(object):
out = func(self.argOne, argTwo[0])
assert_equal(out.shape, self.tgtShape)
-# TODO: Uncomment once randint can broadcast arguments
-# def test_randint(self):
-# itype = [bool, np.int8, np.uint8, np.int16, np.uint16,
-# np.int32, np.uint32, np.int64, np.uint64]
-# func = random.randint
-# high = np.array([1])
-# low = np.array([0])
-#
-# for dt in itype:
-# out = func(low, high, dtype=dt)
-# self.assert_equal(out.shape, self.tgtShape)
-#
-# out = func(low[0], high, dtype=dt)
-# self.assert_equal(out.shape, self.tgtShape)
-#
-# out = func(low, high[0], dtype=dt)
-# self.assert_equal(out.shape, self.tgtShape)
-
def test_three_arg_funcs(self):
funcs = [random.noncentral_f, random.triangular,
random.hypergeometric]