NumPy参考 >例行程序 >Random sampling (numpy.random) > What’s New or Different
警告
用于生成NumPy法线的Box-Muller方法在中不再可用Generator
。无法使用Generator
正态分布或依赖于正态的任何其他分布(例如Generator.gamma
或)
来复制确切的随机值Generator.standard_t
。如果需要按位向后兼容的流,请使用RandomState
,即RandomState.gamma
或
RandomState.standard_t
。
旧版mtrand与新版mtrand的快速比较Generator
特征 |
较旧的等值 |
笔记 |
|
||
|
|
访问BitGenerator中的值,将其转换 还支持许多其他发行版。 |
|
|
使用 |
更详细地:
从复杂的正态分布(complex_normal)模拟
正常,指数和γ发生器用256步通灵塔的方法,这比与NumPy的缺省实现更快的2-10倍
standard_normal
,standard_exponential
或
standard_gamma
。
integers
现在是从离散均匀分布生成整数随机数的规范方法。该rand
和
randn
方法只能通过遗产RandomState
。这将替换randint
和不推荐使用的random_integers
。
用于生成NumPy法线的Box-Muller方法不再可用。
所有位生成器都可以通过CTypes(ctypes
)和CFFI(cffi
)生成double,uint64和uint32 。这使这些位生成器可以在numba中使用。
可以通过Cython在下游项目中使用位发生器。
In [1]: from numpy.random import Generator, PCG64
In [2]: import numpy.random
In [3]: rg = Generator(PCG64())
In [4]: %timeit rg.standard_normal(100000)
...: %timeit numpy.random.standard_normal(100000)
...:
1 ms +- 2.11 us per loop (mean +- std. dev. of 7 runs, 1000 loops each)
1.81 ms +- 12.7 us per loop (mean +- std. dev. of 7 runs, 1000 loops each)
In [5]: %timeit rg.standard_exponential(100000)
...: %timeit numpy.random.standard_exponential(100000)
...:
382 us +- 448 ns per loop (mean +- std. dev. of 7 runs, 1000 loops each)
1.33 ms +- 979 ns per loop (mean +- std. dev. of 7 runs, 1000 loops each)
In [6]: %timeit rg.standard_gamma(3.0, 100000)
...: %timeit numpy.random.standard_gamma(3.0, 100000)
...:
1.86 ms +- 1.54 us per loop (mean +- std. dev. of 7 runs, 1000 loops each)
3.6 ms +- 17 us per loop (mean +- std. dev. of 7 runs, 100 loops each)
可选dtype
参数,它接受np.float32
或np.float64
产生用于选择分布的单或双预均匀一致随机变量
法线(standard_normal
)
标准伽玛(standard_gamma
)
标准指数(standard_exponential
)
In [7]: rg = Generator(PCG64(0))
In [8]: rg.random(3, dtype='d')
Out[8]: array([0.63696169, 0.26978671, 0.04097352])
In [9]: rg.random(3, dtype='f')
Out[9]: array([0.07524014, 0.01652753, 0.17526722], dtype=float32)
可选out
参数,允许为选择分布填充现有数组
制服(random
)
法线(standard_normal
)
标准伽玛(standard_gamma
)
标准指数(standard_exponential
)
这允许多线程使用合适的BitGenerators并行地将大数组填充为大块。
In [10]: existing = np.zeros(4)
In [11]: rg.random(out=existing[:2])
Out[11]: array([0.91275558, 0.60663578])
In [12]: print(existing)
[0.91275558 0.60663578 0. 0. ]