随机 Generator
#
该 Generator
提供对各种分布的访问,并作为 RandomState
的替代品。两者之间的主要区别在于 Generator
依赖于一个额外的 BitGenerator 来管理状态并生成随机比特,然后将其转换为来自有用分布的随机值。Generator
使用的默认 BitGenerator 是 PCG64
。可以通过将实例化的 BitGenerator 传递给 Generator
来更改 BitGenerator。
- numpy.random.default_rng(seed=None)#
使用默认 BitGenerator (PCG64) 构造新的 Generator。
- 参数:
- 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)#
BitGenerator 的容器。
Generator
公开了许多用于生成从各种概率分布中抽取的随机数的方法。除了特定于分布的参数之外,每个方法都接受一个关键字参数 size,其默认值为None
。如果 size 为None
,则会生成并返回单个值。如果 size 是一个整数,则会返回一个填充了生成值的 1 维数组。如果 size 是一个元组,则会返回一个填充了该形状的数组。函数
numpy.random.default_rng
会使用 NumPy 的默认BitGenerator
实例化Generator
。无兼容性保证
Generator
不提供版本兼容性保证。特别是,随着更好的算法的演变,比特流可能会发生变化。- 参数:
- bit_generatorBitGenerator
用作核心生成器的 BitGenerator。
另请参见
default_rng
Generator
的推荐构造函数。
注释
Python 标准库模块
random
包含一个伪随机数生成器,它具有许多与Generator
中提供的方法类似的方法。它使用 Mersenne Twister,并且可以使用MT19937
访问此比特生成器。除了是 NumPy 感知的之外,Generator
的优势在于它提供了更多可供选择的概率分布。示例
>>> from numpy.random import Generator, PCG64 >>> rng = Generator(PCG64()) >>> rng.standard_normal() -0.203 # random
访问 BitGenerator 并生成子生成器#
获取生成器使用的比特生成器实例 |
|
|
创建新的独立子生成器。 |
简单随机数据#
排列#
随机排列序列的方法如下:
|
通过对其内容进行洗牌来就地修改数组或序列。 |
|
随机排列序列,或返回排列后的范围。 |
|
沿轴 axis 随机排列 x。 |
下表总结了这些方法的行为。
方法 |
复制/就地 |
轴处理 |
---|---|---|
shuffle |
就地 |
如同 1 维 |
permutation |
复制 |
如同 1 维 |
permuted |
两者(使用“out”进行就地操作) |
轴无关 |
以下小节将更详细地介绍这些差异。
就地操作与复制#
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 分布中抽取样本。 |
|
从二项分布中抽取样本。 |
|
从卡方分布中抽取样本。 |
|
从狄利克雷分布中抽取样本。 |
|
从指数分布中抽取样本。 |
|
从 F 分布中抽取样本。 |
|
从 Gamma 分布中抽取样本。 |
|
从几何分布中抽取样本。 |
|
从 Gumbel 分布中抽取样本。 |
|
从超几何分布中抽取样本。 |
|
从拉普拉斯分布或双指数分布中抽取样本,指定位置(或均值)和尺度(衰减)。 |
|
从逻辑斯蒂分布中抽取样本。 |
|
从对数正态分布中抽取样本。 |
|
从对数级数分布中抽取样本。 |
|
从多项分布中抽取样本。 |
|
从多元超几何分布生成变量。 |
|
从多元正态分布中抽取随机样本。 |
|
从负二项分布中抽取样本。 |
|
从非中心卡方分布中抽取样本。 |
|
从非中心 F 分布中抽取样本。 |
|
从正态(高斯)分布中抽取随机样本。 |
|
从帕累托 II(也称为洛马克斯)分布中抽取样本,指定形状。 |
|
从泊松分布中抽取样本。 |
|
从具有正指数 a - 1 的幂分布中抽取 [0, 1] 中的样本。 |
|
从瑞利分布中抽取样本。 |
|
从模式 = 0 的标准柯西分布中抽取样本。 |
|
从标准指数分布中抽取样本。 |
|
从标准 Gamma 分布中抽取样本。 |
|
从标准正态分布(均值 = 0,标准差 = 1)中抽取样本。 |
|
从具有 df 自由度的标准学生 t 分布中抽取样本。 |
|
从 |
|
从均匀分布中抽取样本。 |
|
从冯米塞斯分布中抽取样本。 |
|
从 Wald 分布或逆高斯分布中抽取样本。 |
|
从威布尔分布中抽取样本。 |
|
从齐夫分布中抽取样本。 |