有什么新内容或不同之处#
NumPy 1.17.0 引入了 Generator
作为 legacy RandomState
的改进替代品.以下是两种实现的快速比较.
功能 |
旧版等效 |
备注 |
生成器 |
|
|
访问 BitGenerator 中的值,将它们转换为 许多其他发行版也得到支持. |
||
使用 |
普通的、指数的和伽马生成器使用 256 步的 Ziggurat 方法,这些方法比 NumPy 在
standard_normal
、standard_exponential
或standard_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)
...:
516 us +- 18.5 us per loop (mean +- std. dev. of 7 runs, 1 loop each)
1.62 ms +- 67.4 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)
...:
585 us +- 136 us per loop (mean +- std. dev. of 7 runs, 1 loop each)
1.23 ms +- 11.7 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)
...:
1.27 ms +- 11.2 us per loop (mean +- std. dev. of 7 runs, 1 loop each)
2.68 ms +- 34.9 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 (
ctypes
) 和 CFFI (cffi
) 生成双精度数、uint64 和 uint32.这使得这些比特生成器可以在 numba 中使用.位生成器可以通过 Cython 在下游项目中使用.
所有的比特生成器使用
SeedSequence
来 将种子整数转换为初始化状态.可选的
dtype
参数,接受np.float32
或np.float64
以生成选择分布的单精度或双精度均匀随机变量.`~.Generator.integers` 接受一个带有任何有符号或无符号整数 dtype 的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.56834421, 0.66387157, 0.27851115])
In [8]: rng.random(3, dtype=np.float32)
Out[8]: array([0.23236209, 0.28238696, 0.6453461 ], dtype=float32)
In [9]: rng.integers(0, 256, size=3, dtype=np.uint8)
Out[9]: array([109, 158, 164], dtype=uint8)
可选的
out
参数,允许为选定的分布填充现有数组制服 (
random
)标准正态分布 (
standard_normal
)标准伽玛 (
standard_gamma
)标准指数 (
standard_exponential
)
这允许使用合适的 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.7525722 , 0.66417526])
In [13]: print(existing)
[0.7525722 0.66417526 0. 0. ]
方法如
choice
、permutation
和shuffle
的可选axis
参数,控制多维数组上操作的轴.
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([[ 2, 1, 2, 1, 1],
[ 6, 5, 6, 5, 5],
[10, 9, 10, 9, 9]])
In [18]: rng.shuffle(a, axis=1) # Shuffle in-place
In [19]: a
Out[19]:
array([[ 0, 2, 1, 3],
[ 4, 6, 5, 7],
[ 8, 10, 9, 11]])
添加了一个从复正态分布中采样的方法(complex_normal)