有什么新的或不同的#

NumPy 1.17.0 是Generator作为旧版本 RandomState的改进替代品引入的。这是两种实现的快速比较。

特征

较旧的同等产品

笔记

Generator

RandomState

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

random

random_sample, rand

访问 BitGenerator 中的值,将它们转换为float64区间[0.0.,“1.0)”。除了sizekwarg 之外,现在还支持dtype='d'ordtype='f'outkwarg 来填充用户提供的数组。

还支持许多其他发行版。

integers

randint, random_integers

使用endpointkwarg 调整 high区间端点的包含或排除

  • standard_normal正态、指数和伽玛生成器使用 256 步 Ziggurat 方法,比、standard_exponential或 中 NumPy 的默认实现快 2-10 倍 standard_gamma。由于算法的变化,不可能重现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)
   ...: 
1.22 ms +- 17.9 us per loop (mean +- std. dev. of 7 runs, 1 loop each)
2.19 ms +- 12.5 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)
   ...: 
670 us +- 16.2 us per loop (mean +- std. dev. of 7 runs, 1 loop each)
1.62 ms +- 17.8 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)
   ...: 
2.46 ms +- 13 us per loop (mean +- std. dev. of 7 runs, 1 loop each)
4.42 ms +- 7.76 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.32742445, 0.00929327, 0.97225134])

In [8]: rng.random(3, dtype=np.float32)
Out[8]: array([0.67851496, 0.9865629 , 0.23022616], dtype=float32)

In [9]: rng.integers(0, 256, size=3, dtype=np.uint8)
Out[9]: array([164,  54, 133], 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.83108158, 0.52678072])

In [13]: print(existing)
[0.83108158 0.52678072 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([[ 1,  1,  0,  3,  3],
       [ 5,  5,  4,  7,  7],
       [ 9,  9,  8, 11, 11]])

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

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