随机 生成器
#
Generator
提供了对多种分布的访问,并作为 RandomState
的替代品.两者之间的主要区别在于 Generator
依赖于一个额外的 BitGenerator 来管理状态并生成随机位,这些随机位随后被转换为来自有用分布的随机值.`Generator` 使用的默认 BitGenerator 是 PCG64
.可以通过传递一个实例化的 BitGenerator 来更改 Generator
使用的 BitGenerator.
- numpy.random.default_rng(seed=None)#
使用默认的 BitGenerator (PCG64) 构造一个新的生成器.
- 参数:
- seed{None, int, array_like[ints], SeedSequence, BitGenerator, Generator}, 可选
用于初始化
BitGenerator
的种子.如果为 None,则将从操作系统中提取新的、不可预测的熵.如果传递的是int
或array_like[ints]
,则所有值必须为非负数,并将传递给SeedSequence
以派生初始BitGenerator
状态.还可以传递一个SeedSequence
实例.此外,当传递一个BitGenerator
时,它将被Generator
包装.如果传递的是Generator
,则将原样返回.
- 返回:
- Generator
初始化的生成器对象.
备注
如果
seed
不是一个BitGenerator
或Generator
,则会实例化一个新的BitGenerator
.此函数不管理默认的全局实例.有关种子的更多信息,请参见 种子和熵.
示例
default_rng
是随机数类Generator
推荐的构造函数.以下是使用default_rng
和Generator
类构造随机数生成器的几种方法.这里我们使用
default_rng
来生成一个随机浮点数:>>> import numpy as np >>> rng = np.random.default_rng(12345) >>> print(rng) Generator(PCG64) >>> rfloat = rng.random() >>> rfloat 0.22733602246716966 >>> type(rfloat) <class 'float'>
在这里,我们使用
default_rng
生成 3 个介于 0(包含)和 10(不包含)之间的随机整数:>>> import numpy as np >>> rng = np.random.default_rng(12345) >>> rints = rng.integers(low=0, high=10, size=3) >>> rints array([6, 2, 7]) >>> type(rints[0]) <class 'numpy.int64'>
这里我们指定一个种子,以便我们有可重复的结果:
>>> import numpy as np >>> rng = np.random.default_rng(seed=42) >>> print(rng) Generator(PCG64) >>> arr1 = rng.random((3, 3)) >>> arr1 array([[0.77395605, 0.43887844, 0.85859792], [0.69736803, 0.09417735, 0.97562235], [0.7611397 , 0.78606431, 0.12811363]])
如果我们退出并重新启动我们的 Python 解释器,我们会看到我们再次生成了相同的随机数:
>>> import numpy as np >>> rng = np.random.default_rng(seed=42) >>> arr2 = rng.random((3, 3)) >>> arr2 array([[0.77395605, 0.43887844, 0.85859792], [0.69736803, 0.09417735, 0.97562235], [0.7611397 , 0.78606431, 0.12811363]])
- class numpy.random.Generator(bit_generator)#
BitGenerators 的容器.
Generator
提供了许多方法来生成从各种概率分布中抽取的随机数.除了分布特定的参数外,每个方法还接受一个关键字参数 size,默认为None
.如果 size 是None
,则生成并返回一个单一值.如果 size 是整数,则返回一个填充了生成值的 1-D 数组.如果 size 是元组,则返回一个填充了该形状的数组.函数
numpy.random.default_rng
将实例化一个带有 numpy 默认BitGenerator
的Generator
.No Compatibility Guarantee
Generator
不提供版本兼容性保证.特别是,随着更好的算法的发展,比特流可能会改变.- 参数:
- bit_generatorBitGenerator
用作核心生成器的 BitGenerator.
参见
default_rng
推荐的
Generator
构造函数.
备注
Python 标准库模块
random
包含一个伪随机数生成器,具有许多与Generator
中可用的方法相似的方法.它使用梅森旋转算法,这个比特生成器可以使用MT19937
访问.`Generator` 除了具有 NumPy 意识外,还有一个优势,即它提供了更多种类的概率分布可供选择.示例
>>> from numpy.random import Generator, PCG64 >>> rng = Generator(PCG64()) >>> rng.standard_normal() -0.203 # random
访问 BitGenerator 和生成#
获取生成器使用的位生成器实例 |
|
|
创建新的独立子生成器. |
简单随机数据#
排列#
随机排列序列的方法有
|
通过打乱其内容来就地修改数组或序列. |
|
随机排列一个序列,或返回一个排列的范围. |
|
沿着轴 axis 随机排列 x. |
下表总结了这些方法的行为.
方法 |
copy/in-place |
轴处理 |
---|---|---|
shuffle |
就地 |
仿佛 1D |
排列 |
copy |
仿佛 1D |
permuted |
要么(使用 ‘out’ 进行就地操作) |
轴独立 |
以下小节提供了关于差异的更多详细信息.
就地 vs. 复制#
Generator.shuffle
和 Generator.permutation
之间的主要区别在于 Generator.shuffle
是就地操作,而 Generator.permutation
返回一个副本.
默认情况下,`Generator.permuted` 返回一个副本.要在原地操作 Generator.permuted
,将同一个数组作为第一个参数 并且 作为 out
参数的值传递.例如,
>>> import numpy as np >>> rng = np.random.default_rng() >>> x = np.arange(0, 15).reshape(3, 5) >>> x array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]]) >>> y = rng.permuted(x, axis=1, out=x) >>> x array([[ 1, 0, 2, 4, 3], # random [ 6, 7, 8, 9, 5], [10, 14, 11, 13, 12]])注意,当
out
被给出时,返回值是out
:>>> y is x True
处理 axis
参数#
这些方法的一个重要区别在于它们如何处理 axis
参数.`Generator.shuffle` 和 Generator.permutation
都将输入视为一维序列,而 axis
参数决定了使用输入数组的哪个维度作为序列.对于二维数组,``axis=0`` 实际上会重新排列数组的行,而 axis=1
会重新排列列.例如
>>> import numpy as np
>>> rng = np.random.default_rng()
>>> x = np.arange(0, 15).reshape(3, 5)
>>> x
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
>>> rng.permutation(x, axis=1)
array([[ 1, 3, 2, 0, 4], # random
[ 6, 8, 7, 5, 9],
[11, 13, 12, 10, 14]])
请注意,列已经”批量”重新排列:每列中的值没有改变.
方法 Generator.permuted
处理 axis
参数的方式类似于 numpy.sort
处理它的方式.沿给定轴的每个切片独立于其他切片进行打乱.比较以下 Generator.permuted
的使用示例与上述 Generator.permutation
的示例:
>>> import numpy as np
>>> rng = np.random.default_rng()
>>> rng.permuted(x, axis=1)
array([[ 1, 0, 2, 4, 3], # random
[ 5, 7, 6, 9, 8],
[10, 14, 12, 13, 11]])
在这个例子中,每一行的值(即沿着 axis=1
的值)已经被独立地打乱.这不是列的”整体”打乱.
打乱非NumPy序列#
Generator.shuffle
适用于非 NumPy 序列.也就是说,如果给定一个不是 NumPy 数组的序列,它会在原地打乱该序列.
>>> import numpy as np
>>> rng = np.random.default_rng()
>>> a = ['A', 'B', 'C', 'D', 'E']
>>> rng.shuffle(a) # shuffle the list in-place
>>> a
['B', 'D', 'A', 'E', 'C'] # random
发行版#
|
从 Beta 分布中抽取样本. |
|
从二项分布中抽取样本. |
|
从卡方分布中抽取样本. |
|
从Dirichlet分布中抽取样本. |
|
从指数分布中抽取样本. |
|
从 F 分布中抽取样本. |
|
从Gamma分布中抽取样本. |
|
从几何分布中抽取样本. |
|
从Gumbel分布中抽取样本. |
|
从超几何分布中抽取样本. |
|
从具有指定位置(或均值)和尺度(衰减)的拉普拉斯或双指数分布中抽取样本. |
|
从逻辑分布中抽取样本. |
|
从对数正态分布中抽取样本. |
|
从对数级数分布中抽取样本. |
|
从多项分布中抽取样本. |
|
从多元超几何分布生成变量. |
|
从多元正态分布中抽取随机样本. |
|
从负二项分布中抽取样本. |
|
从非中心卡方分布中抽取样本. |
|
从非中心 F 分布中抽取样本. |
|
从正态(高斯)分布中随机抽取样本. |
|
从具有指定形状的帕累托 II(又名 Lomax)分布中抽取样本. |
|
从泊松分布中抽取样本. |
|
从指数为正的幂分布中在 [0, 1] 范围内抽取样本,指数为 a - 1. |
|
从瑞利分布中抽取样本. |
|
从模式为0的标准柯西分布中抽取样本. |
|
从标准指数分布中抽取样本. |
|
从标准Gamma分布中抽取样本. |
|
从标准正态分布(均值=0,标准差=1)中抽取样本. |
|
从具有 df 自由度的标准学生 t 分布中抽取样本. |
|
从区间 |
|
从均匀分布中抽取样本. |
|
从 von Mises 分布中抽取样本. |
|
从Wald或逆高斯分布中抽取样本. |
|
从 Weibull 分布中抽取样本. |
|
从Zipf分布中抽取样本. |