新增功能或不同之处#

NumPy 1.17.0 引入了 Generator 作为 legacy RandomState 的改进替代品.这是一个对两种实现的快速比较.

特性

旧的等效项

注释

Generator

RandomState

Generator 需要一个流源,称为 BitGenerator . 提供了许多这样的源.默认情况下, RandomState 使用 Mersenne Twister MT19937 ,但也可以使用任何 BitGenerator 实例化.

random

random_sample , rand

访问 BitGenerator 中的值,将其转换为 float64 ,范围在 [0.0., 1.0) 内.除了 size kwarg 之外,现在还支持 dtype='d'dtype='f' ,以及一个 out kwarg 来填充用户提供的数组.

还支持许多其他发行版.

integers

randint , random_integers

使用 endpoint kwarg 调整 high 区间端点的包含或排除.

  • 正态,指数和伽马生成器使用 256 步 Ziggurat 方法,该方法比 NumPy 在 standard_normal , standard_exponentialstandard_gamma 中的默认实现快 2-10 倍.由于算法的更改,因此无法使用这些分布或依赖于它们的任何分布方法的 Generator 重现确切的随机值.

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)
   ...: 
The slowest run took 5.41 times longer than the fastest. This could mean that an intermediate result is being cached.
2.43 ms +- 2.15 ms per loop (mean +- std. dev. of 7 runs, 1 loop each)
3.34 ms +- 163 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)
   ...: 
963 us +- 85.3 us per loop (mean +- std. dev. of 7 runs, 1 loop each)
2.81 ms +- 636 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.46 ms +- 383 us per loop (mean +- std. dev. of 7 runs, 1 loop each)
6.33 ms +- 536 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.40436966, 0.57953545, 0.38496263])

In [8]: rng.random(3, dtype=np.float32)
Out[8]: array([0.2718469 , 0.15777564, 0.7979569 ], dtype=float32)

In [9]: rng.integers(0, 256, size=3, dtype=np.uint8)
Out[9]: array([199, 169,  22], dtype=uint8)
  • 可选的 out 参数,允许填充现有数组以用于选择分布

    这允许使用多线程以并行方式使用合适的 BitGenerators 分块填充大型数组.

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

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

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

In [13]: print(existing)
[0.70319608 0.97012694 0.         0.        ]
  • 可选的 axis 参数,用于像 choice , permutationshuffle 这样的方法,用于控制对多维数组执行操作的轴.

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,  0,  2,  3,  2],
       [ 4,  4,  6,  7,  6],
       [ 8,  8, 10, 11, 10]])

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

In [19]: a
Out[19]: 
array([[ 2,  3,  1,  0],
       [ 6,  7,  5,  4],
       [10, 11,  9,  8]])
  • 添加了一个从复正态分布中采样的方法 ( complex_normal )