有什么新的或不同的#
NumPy 1.17.0 是Generator
作为旧版本 RandomState
的改进替代品引入的。这是两种实现的快速比较。
特征 |
较旧的同等产品 |
笔记 |
|
||
|
|
访问 BitGenerator 中的值,将它们转换为 还支持许多其他发行版。 |
|
|
使用 |
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)
integers
现在是从离散均匀分布生成整数随机数的规范方法。这取代了randint
和 已弃用的random_integers
.和
rand
方法randn
只能通过旧版使用RandomState
。Generator.random
现在是生成浮点随机数的规范方法,它取代了RandomState.random_sample
、sample
、 和ranf
,所有这些都是别名。这与Python的random.random
.ctypes
所有位生成器都可以通过 CType ( ) 和 CFFI ( )生成双精度数、uint64 和 uint32cffi
。这使得这些位生成器可以在 numba 中使用。位生成器可通过 Cython 在下游项目中使用。
所有位生成器都用于
SeedSequence
将种子整数转换为初始化状态。可选参数
dtype
,接受np.float32
或np.float64
生成选择分布的单精度或双精度均匀随机变量。integers
接受dtype
具有任何有符号或无符号整数数据类型的参数。法线 (
standard_normal
)标准伽马 (
standard_gamma
)标准指数 (
standard_exponential
)
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)
可选
out
参数,允许为选择的分布填充现有数组制服 (
random
)法线 (
standard_normal
)标准伽马 (
standard_gamma
)标准指数 (
standard_exponential
)
这允许多线程使用合适的 BitGenerator 并行填充大型数组。
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. ]
和
axis
等方法的可选参数choice
, 控制对多维数组执行操作的轴。permutation
shuffle
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)中采样的方法