What’s new or different — NumPy v2.3 Manual (original) (raw)

NumPy 1.17.0 introduced Generator as an improved replacement for the legacy RandomState. Here is a quick comparison of the two implementations.

In [1]: import numpy.random

In [2]: rng = np.random.default_rng()

In [3]: %timeit -n 1 rng.standard_normal(100000) ...: %timeit -n 1 numpy.random.standard_normal(100000) ...: 1.88 ms +- 13.3 us per loop (mean +- std. dev. of 7 runs, 1 loop each) 3.46 ms +- 20.2 us per loop (mean +- std. dev. of 7 runs, 1 loop each)

In [4]: %timeit -n 1 rng.standard_exponential(100000) ...: %timeit -n 1 numpy.random.standard_exponential(100000) ...: 919 us +- 12.4 us per loop (mean +- std. dev. of 7 runs, 1 loop each) 2.47 ms +- 23.4 us per loop (mean +- std. dev. of 7 runs, 1 loop each)

In [5]: %timeit -n 1 rng.standard_gamma(3.0, 100000) ...: %timeit -n 1 numpy.random.standard_gamma(3.0, 100000) ...: 3.53 ms +- 39.5 us per loop (mean +- std. dev. of 7 runs, 1 loop each) 6.96 ms +- 25.1 us per loop (mean +- std. dev. of 7 runs, 1 loop each)

In [6]: rng = np.random.default_rng()

In [7]: rng.random(3, dtype=np.float64) Out[7]: array([0.00512656, 0.76054751, 0.5135002 ])

In [8]: rng.random(3, dtype=np.float32) Out[8]: array([0.13016486, 0.67658764, 0.94141597], dtype=float32)

In [9]: rng.integers(0, 256, size=3, dtype=np.uint8) Out[9]: array([100, 186, 43], dtype=uint8)

In [10]: rng = np.random.default_rng()

In [11]: existing = np.zeros(4)

In [12]: rng.random(out=existing[:2]) Out[12]: array([0.7695275 , 0.73739323])

In [13]: print(existing) [0.7695275 0.73739323 0. 0. ]

In [14]: rng = np.random.default_rng()

In [15]: a = np.arange(12).reshape((3, 4))

In [16]: a Out[16]: array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]])

In [17]: rng.choice(a, axis=1, size=5) Out[17]: array([[ 0, 1, 2, 0, 0], [ 4, 5, 6, 4, 4], [ 8, 9, 10, 8, 8]])

In [18]: rng.shuffle(a, axis=1) # Shuffle in-place

In [19]: a Out[19]: array([[ 2, 1, 0, 3], [ 6, 5, 4, 7], [10, 9, 8, 11]])