随机 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,则将从操作系统中提取新鲜的、不可预测的熵。如果传递了 intarray_like[ints],则所有值必须为非负数,并将传递给 SeedSequence 以推导出初始 BitGenerator 状态。也可以传递 SeedSequence 实例。此外,当传递 BitGenerator 时,它将被 Generator 包装。如果传递了 Generator,则将不加修改地返回它。

返回:
Generator

已初始化的生成器对象。

注释

如果 seed 不是 BitGeneratorGenerator,则会实例化新的 BitGenerator。此函数不管理默认的全局实例。

有关种子的更多信息,请参见 种子和熵

示例

default_rng 是随机数类 Generator 的推荐构造函数。以下几种方法可以使用 default_rngGenerator 类来构造随机数生成器。

这里我们使用 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。如果 sizeNone,则会生成并返回单个值。如果 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 并生成子生成器#

bit_generator

获取生成器使用的比特生成器实例

spawn(n_children)

创建新的独立子生成器。

简单随机数据#

integers(low[, high, size, dtype, endpoint])

返回从 low(包含)到 high(不包含)的随机整数,或者如果 endpoint=True,则从 low(包含)到 high(包含)的随机整数。

random([size, dtype, out])

在半开区间 [0.0, 1.0) 内返回随机浮点数。

choice(a[, size, replace, p, axis, shuffle])

从给定数组中生成随机样本

bytes(length)

返回随机字节。

排列#

随机排列序列的方法如下:

shuffle(x[, axis])

通过对其内容进行洗牌来就地修改数组或序列。

permutation(x[, axis])

随机排列序列,或返回排列后的范围。

permuted(x[, axis, out])

沿轴 axis 随机排列 x

下表总结了这些方法的行为。

方法

复制/就地

轴处理

shuffle

就地

如同 1 维

permutation

复制

如同 1 维

permuted

两者(使用“out”进行就地操作)

轴无关

以下小节将更详细地介绍这些差异。

就地操作与复制#

Generator.shuffleGenerator.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.shuffleGenerator.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.permutedaxis 参数的处理方式类似于 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(a, b[, size])

从 Beta 分布中抽取样本。

binomial(n, p[, size])

从二项分布中抽取样本。

chisquare(df[, size])

从卡方分布中抽取样本。

dirichlet(alpha[, size])

从狄利克雷分布中抽取样本。

exponential([scale, size])

从指数分布中抽取样本。

f(dfnum, dfden[, size])

从 F 分布中抽取样本。

gamma(shape[, scale, size])

从 Gamma 分布中抽取样本。

geometric(p[, size])

从几何分布中抽取样本。

gumbel([loc, scale, size])

从 Gumbel 分布中抽取样本。

hypergeometric(ngood, nbad, nsample[, size])

从超几何分布中抽取样本。

laplace([loc, scale, size])

从拉普拉斯分布或双指数分布中抽取样本,指定位置(或均值)和尺度(衰减)。

logistic([loc, scale, size])

从逻辑斯蒂分布中抽取样本。

lognormal([mean, sigma, size])

从对数正态分布中抽取样本。

logseries(p[, size])

从对数级数分布中抽取样本。

multinomial(n, pvals[, size])

从多项分布中抽取样本。

multivariate_hypergeometric(colors, nsample)

从多元超几何分布生成变量。

multivariate_normal(mean, cov[, size, ...])

从多元正态分布中抽取随机样本。

negative_binomial(n, p[, size])

从负二项分布中抽取样本。

noncentral_chisquare(df, nonc[, size])

从非中心卡方分布中抽取样本。

noncentral_f(dfnum, dfden, nonc[, size])

从非中心 F 分布中抽取样本。

normal([loc, scale, size])

从正态(高斯)分布中抽取随机样本。

pareto(a[, size])

从帕累托 II(也称为洛马克斯)分布中抽取样本,指定形状。

poisson([lam, size])

从泊松分布中抽取样本。

power(a[, size])

从具有正指数 a - 1 的幂分布中抽取 [0, 1] 中的样本。

rayleigh([scale, size])

从瑞利分布中抽取样本。

standard_cauchy([size])

从模式 = 0 的标准柯西分布中抽取样本。

standard_exponential([size, dtype, method, out])

从标准指数分布中抽取样本。

standard_gamma(shape[, size, dtype, out])

从标准 Gamma 分布中抽取样本。

standard_normal([size, dtype, out])

从标准正态分布(均值 = 0,标准差 = 1)中抽取样本。

standard_t(df[, size])

从具有 df 自由度的标准学生 t 分布中抽取样本。

triangular(left, mode, right[, size])

[left, right] 区间上的三角形分布中抽取样本。

uniform([low, high, size])

从均匀分布中抽取样本。

vonmises(mu, kappa[, size])

从冯米塞斯分布中抽取样本。

wald(mean, scale[, size])

从 Wald 分布或逆高斯分布中抽取样本。

weibull(a[, size])

从威布尔分布中抽取样本。

zipf(a[, size])

从齐夫分布中抽取样本。