随机 Generator#
Generator 提供了对多种分布的访问,并替代了 RandomState。两者之间的主要区别在于 Generator 依赖于一个额外的 BitGenerator 来管理状态并生成随机位,然后这些随机位被转换为来自有用分布的随机值。Generator 使用的默认 BitGenerator 是 PCG64。可以通过向 Generator 传递一个实例化后的 BitGenerator 来更改 BitGenerator。
- numpy.random.default_rng(seed=None)#
- 使用默认的 BitGenerator (PCG64) 构造一个新的 Generator。 - 参数:
- seed{None, int, array_like[ints], SeedSequence, BitGenerator, Generator, RandomState},可选
- 用于初始化 - BitGenerator的种子。如果为 None,则将从操作系统中获取新的、不可预测的熵。如果传递- int或- array_like[ints],则所有值必须为非负数,并将传递给- SeedSequence以推导初始- BitGenerator状态。也可以传入- SeedSequence实例。此外,当传入- BitGenerator时,它将被- Generator包装。如果传入- Generator,则会原样返回。当传入旧版- RandomState实例时,它将被强制转换为- 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 为整数,则返回一个填充了生成值的一维数组。如果 size 为元组,则填充并返回具有该形状的数组。- 函数 - numpy.random.default_rng将使用 NumPy 的默认- BitGenerator实例化一个- Generator。- 不提供兼容性保证 - Generator不提供版本兼容性保证。特别是,随着更优算法的演进,位流可能会发生变化。- 参数:
- bit_generatorBitGenerator
- 用作核心生成器的 BitGenerator。 
 
 - 另请参阅 - default_rng
- Generator的推荐构造函数。
 - 备注 - Python 标准库模块 - random包含伪随机数生成器,其许多方法与- Generator中可用的方法类似。它使用 Mersenne Twister,并且可以通过- MT19937访问此位生成器。- Generator除了具有 NumPy 感知能力外,还具有提供更多可选概率分布的优势。- 示例 - >>> from numpy.random import Generator, PCG64 >>> rng = Generator(PCG64()) >>> rng.standard_normal() -0.203 # random 
访问 BitGenerator 和生成子生成器#
| 获取生成器使用的位生成器实例 | |
| 
 | 创建新的独立子生成器。 | 
简单随机数据#
置换#
随机置换序列的方法有
| 
 | 通过打乱其内容,原地修改数组或序列。 | 
| 
 | 随机置换序列,或返回置换后的范围。 | 
| 
 | 沿轴 axis 随机置换 x。 | 
下表总结了这些方法的行为。
| 方法 | 复制/原地 | 轴处理 | 
|---|---|---|
| shuffle | 原地 | 如同 1D | 
| permutation | 复制 | 如同 1D | 
| 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 分布中抽取样本。 | 
| 
 | 从二项分布中抽取样本。 | 
| 
 | 从卡方分布中抽取样本。 | 
| 
 | 从 Dirichlet 分布中抽取样本。 | 
| 
 | 从指数分布中抽取样本。 | 
| 
 | 从 F 分布中抽取样本。 | 
| 
 | 从 Gamma 分布中抽取样本。 | 
| 
 | 从几何分布中抽取样本。 | 
| 
 | 从 Gumbel 分布中抽取样本。 | 
| 
 | 从超几何分布中抽取样本。 | 
| 
 | 从具有指定位置(或均值)和尺度(衰减)的拉普拉斯或双指数分布中抽取样本。 | 
| 
 | 从逻辑分布中抽取样本。 | 
| 
 | 从对数正态分布中抽取样本。 | 
| 
 | 从对数级数分布中抽取样本。 | 
| 
 | 从多项分布中抽取样本。 | 
| 
 | 从多元超几何分布生成变异数。 | 
| 
 | 从多元正态分布中抽取随机样本。 | 
| 
 | 从负二项分布中抽取样本。 | 
| 
 | 从非中心卡方分布中抽取样本。 | 
| 
 | 从非中心 F 分布中抽取样本。 | 
| 
 | 从正态(高斯)分布中抽取随机样本。 | 
| 
 | 从具有指定形状的帕累托 II(又称 Lomax)分布中抽取样本。 | 
| 
 | 从泊松分布中抽取样本。 | 
| 
 | 从具有正指数 a - 1 的幂分布中抽取 [0, 1] 范围内的样本。 | 
| 
 | 从瑞利分布中抽取样本。 | 
| 
 | 从众数为 0 的标准柯西分布中抽取样本。 | 
| 
 | 从标准指数分布中抽取样本。 | 
| 
 | 从标准 Gamma 分布中抽取样本。 | 
| 
 | 从标准正态分布(均值=0,标准差=1)中抽取样本。 | 
| 
 | 从自由度为 df 的标准学生 t 分布中抽取样本。 | 
| 
 | 从区间  | 
| 
 | 从均匀分布中抽取样本。 | 
| 
 | 从 von Mises 分布中抽取样本。 | 
| 
 | 从 Wald 分布或逆高斯分布中抽取样本。 | 
| 
 | 从 Weibull 分布中抽取样本。 | 
| 
 | 从 Zipf 分布中抽取样本。 |