What’s New or Different¶
Warning
The Box-Muller method used to produce NumPy’s normals is no longer available
in Generator
. It is not possible to reproduce the exact random
values using Generator
for the normal distribution or any other
distribution that relies on the normal such as the Generator.gamma
or
Generator.standard_t
. If you require bitwise backward compatible
streams, use RandomState
, i.e., RandomState.gamma
or
RandomState.standard_t
.
Quick comparison of legacy mtrand to the new Generator
Feature |
Older Equivalent |
Notes |
|
||
|
|
Access the values in a BitGenerator,
convert them to Many other distributions are also supported. |
|
|
Use the |
And in more detail:
Simulate from the complex normal distribution (complex_normal)
The normal, exponential and gamma generators use 256-step Ziggurat methods which are 2-10 times faster than NumPy’s default implementation in
standard_normal
,standard_exponential
orstandard_gamma
.integers
is now the canonical way to generate integer random numbers from a discrete uniform distribution. Therand
andrandn
methods are only available through the legacyRandomState
. This replaces bothrandint
and the deprecatedrandom_integers
.The Box-Muller method used to produce NumPy’s normals is no longer available.
All bit generators can produce doubles, uint64s and uint32s via CTypes (
ctypes
) and CFFI (cffi
). This allows these bit generators to be used in numba.The bit generators can be used in downstream projects via Cython.
In [1]: from numpy.random import Generator, PCG64
In [2]: import numpy.random
In [3]: rg = Generator(PCG64())
In [4]: %timeit rg.standard_normal(100000)
...: %timeit numpy.random.standard_normal(100000)
...:
1 ms +- 2.11 us per loop (mean +- std. dev. of 7 runs, 1000 loops each)
1.81 ms +- 12.7 us per loop (mean +- std. dev. of 7 runs, 1000 loops each)
In [5]: %timeit rg.standard_exponential(100000)
...: %timeit numpy.random.standard_exponential(100000)
...:
382 us +- 448 ns per loop (mean +- std. dev. of 7 runs, 1000 loops each)
1.33 ms +- 979 ns per loop (mean +- std. dev. of 7 runs, 1000 loops each)
In [6]: %timeit rg.standard_gamma(3.0, 100000)
...: %timeit numpy.random.standard_gamma(3.0, 100000)
...:
1.86 ms +- 1.54 us per loop (mean +- std. dev. of 7 runs, 1000 loops each)
3.6 ms +- 17 us per loop (mean +- std. dev. of 7 runs, 100 loops each)
Optional
dtype
argument that acceptsnp.float32
ornp.float64
to produce either single or double prevision uniform random variables for select distributionsNormals (
standard_normal
)Standard Gammas (
standard_gamma
)Standard Exponentials (
standard_exponential
)
In [7]: rg = Generator(PCG64(0))
In [8]: rg.random(3, dtype='d')
Out[8]: array([0.63696169, 0.26978671, 0.04097352])
In [9]: rg.random(3, dtype='f')
Out[9]: array([0.07524014, 0.01652753, 0.17526722], dtype=float32)
Optional
out
argument that allows existing arrays to be filled for select distributionsUniforms (
random
)Normals (
standard_normal
)Standard Gammas (
standard_gamma
)Standard Exponentials (
standard_exponential
)
This allows multithreading to fill large arrays in chunks using suitable BitGenerators in parallel.
In [10]: existing = np.zeros(4)
In [11]: rg.random(out=existing[:2])
Out[11]: array([0.91275558, 0.60663578])
In [12]: print(existing)
[0.91275558 0.60663578 0. 0. ]