随机抽样 (numpy.random

Numpy的随机数例程使用 BitGenerator 创建序列和 Generator 要使用这些序列从不同的统计分布中取样:

  • 位生成器:生成随机数的对象。它们通常是无符号整数字,用32或64个随机位的序列填充。

  • 生成器:将位生成器中的随机位序列转换为在指定间隔内遵循特定概率分布(如均匀分布、正态分布或二项式分布)的数字序列的对象。

由于Numpy版本1.17.0,可以使用许多不同的位生成器初始化生成器。它暴露了许多不同的概率分布。看到了吗 NEP 19 更新的随机Numpy数例程的上下文。遗产 RandomState 随机数例程仍然可用,但仅限于单个位生成器。看到了吗 有什么新的或不同的 一个完整的改进列表和与传统的区别 Randomstate .

为了方便和向后兼容,一个 RandomState 实例的方法被导入到随机数命名空间,请参见 遗留随机生成 完整的列表。

快速启动

呼叫 default_rng 获取 Generator ,则从不同的方法调用其分布。默认情况下, Generator 使用由提供的位 PCG64 它的统计特性比传统的 MT19937 用于 RandomState .

# Do this (new version)
from numpy.random import default_rng
rng = default_rng()
vals = rng.standard_normal(10)
more_vals = rng.standard_normal(10)

# instead of this (legacy version)
from numpy import random
vals = random.standard_normal(10)
more_vals = random.standard_normal(10)

Generator can be used as a replacement for RandomState. Both class instances hold a internal BitGenerator instance to provide the bit stream, it is accessible as gen.bit_generator. Some long-overdue API cleanup means that legacy and compatibility methods have been removed from Generator

RandomState

Generator

笔记

random_sample,

random

兼容 random.random

rand

randint

integers

添加一个 endpoint 克瓦格

random_integers

tomaxint

远离的

使用 integers(0, np.iinfo(np.int_).max, endpoint=False)

seed

远离的

使用 SeedSequence.spawn

有什么新的或不同的 更多信息。

类似下面的代码可以用来支持这两个 RandomStateGenerator ,了解到接口略有不同

try:
    rg_integers = rg.integers
except AttributeError:
    rg_integers = rg.randint
a = rg_integers(1000)

种子可以传递给任何比特发生器。提供的值通过 SeedSequence 将可能的种子序列扩展到位生成器的更大范围的初始化状态。在这里 PCG64 使用并用 Generator .

from numpy.random import Generator, PCG64
rg = Generator(PCG64(12345))
rg.standard_normal()

这里我们使用 default_rng 创建的实例 Generator 要生成随机浮点:

>>> 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 创建的实例 Generator 要生成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'>

介绍

新的基础设施采用不同的方法从 RandomState 对象。随机数的产生分为两个部分,位发生器和随机发生器。

这个 BitGenerator 责任有限。它管理状态并提供函数来生成随机双精度和随机无符号32位和64位值。

这个 random generator 例如,假设模拟的比特流生成器将它们转换成更多的正态分布。这种结构允许使用替代位生成器,而代码复制很少。

这个 Generator 面向用户的对象与遗留对象几乎相同 RandomState . 它接受位生成器实例作为参数。默认值当前为 PCG64 但这在未来的版本中可能会改变。作为一种便利,NumPy提供 default_rng 函数隐藏这些详细信息:

>>> from numpy.random import default_rng
>>> rg = default_rng(12345)
>>> print(rg)
Generator(PCG64)
>>> print(rg.random())
0.22733602246716966

也可以实例化 Generator 直接使用 BitGenerator 实例。

使用默认值 PCG64 位生成器,可以直接实例化它并将其传递给 Generator

>>> from numpy.random import Generator, PCG64
>>> rg = Generator(PCG64(12345))
>>> print(rg)
Generator(PCG64)

类似于使用旧的 MT19937 位生成器(不推荐),可以直接实例化并传递给 Generator

>>> from numpy.random import Generator, MT19937
>>> rg = Generator(MT19937(12345))
>>> print(rg)
Generator(MT19937)

有什么新的或不同的

警告

用于生成NumPy法线的Box-Muller方法在中不再可用 Generator . 使用正态分布的生成器或依赖正态分布的任何其他分布(如 RandomState.gammaRandomState.standard_t . 如果需要位向后兼容的流,请使用 RandomState .

  • 生成器的正态函数、指数函数和gamma函数使用256步Ziggurat方法,比NumPy的Box-Muller或逆CDF实现快2-10倍。

  • 可选的 dtype 接受的论点 np.float32np.float64 为选择分布产生单预测或双预测均匀随机变量

  • 可选的 out 参数,该参数允许为所选分发版填充现有数组

  • 所有CTUINs和CTUINs都可以通过T62S生成双CTUINs (PCG64.ctypes )和CFFI (PCG64.cffi ). 这允许位生成器在numba中使用。

  • 位发生器可通过以下方式用于下游项目: Cython .

  • Generator.integers 现在是从离散均匀分布生成整数随机数的标准方法。这个 randrandn 方法只能通过遗留的 RandomState . 这个 endpoint 关键字可用于指定打开或关闭的间隔。这将取代两者 randint 不赞成的 random_integers .

  • Generator.random 现在是生成浮点随机数的标准方法,它取代了 RandomState.random_sampleRandomState.sampleRandomState.ranf . 这与Python的一致 random.random .

  • 所有比特发生器都在numpy使用 SeedSequence 将种子转换为初始化状态。

  • 添加一个 axis 方法的关键字参数,例如 Generator.choiceGenerator.permutationGenerator.shuffle 改进了对多维数组采样和洗牌的支持。

有什么新的或不同的 与传统的 Randomstate .

并联发电

所包含的生成器可通过以下三种方式之一用于并行分布式应用程序:

特征

生成器和位生成器的原始源

该软件包是独立于NumPy开发的,并集成在版本1.17.0中。原始回购在https://github.com/bashtage/randomgen。