numpy.random 与 numpy.random.Generate 之间有什么区别

ole*_*cki 6 python random numpy generator montecarlo

我最近一直在尝试模拟一些 Monte Carlos 模拟并遇到了numpy.random. 检查指数生成器的文档我注意到这是页面中的警告,它告诉

Generator.exponential 应该用于新代码。

虽然如此,numpy.random.exponential仍然有效,但我无法运行Generator对应程序。我一直收到以下错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-14-c4cc7e61aa98> in <module>
----> 1 np.random.Generator.exponential(2, 1000)

TypeError: descriptor 'exponential' for 'numpy.random._generator.Generator' objects doesn't apply to a 'int' object

Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 这2个有什么区别?

  2. 如何生成样本Generator?

Mar*_*son 8

文档中提到Generator的是 NumPy 1.17 中引入的一个类:它是核心类,负责调整来自底层位生成器的值以生成来自各种分布的样本。是(现在)遗留的基于 Mersenne-Twister 的随机框架numpy.random.exponential的一部分。您可能不应该担心遗留功能很快就会被删除 - 这样做会破坏大量代码,但 NumPy 开发人员建议,对于新代码,您应该使用新系统,而不是遗留系统。

关于系统更改的最佳理由可能是 NEP 19:https ://numpy.org/neps/nep-0019-rng-policy.html

要Generator.exponential按照文档的建议使用,您首先需要创建该类的实例Generator。创建此类实例的最简单方法是使用该numpy.random.default_rng()函数。

所以你想从这样的事情开始:

>>> import numpy
>>> my_generator = numpy.random.default_rng()
Run Code Online (Sandbox Code Playgroud)

此时,my_generator是一个实例numpy.random.Generator:

>>> type(my_generator)
<class 'numpy.random._generator.Generator'>
Run Code Online (Sandbox Code Playgroud)

您可以使用my_generator.exponential指数分布获取变量。3.2这里,我们从具有尺度参数(或等效的速率0.3125)的指数分布中抽取 10 个样本:

>>> my_generator.exponential(3.2, size=10)
array([6.26251663, 1.59879107, 1.69010179, 4.17572623, 5.94945358,
       1.19466134, 3.93386506, 3.10576934, 1.26095418, 1.18096234])
Run Code Online (Sandbox Code Playgroud)

您的Generator实例当然也可以用于获取您需要的任何其他随机变量:

>>> my_generator.integers(0, 100, size=3)
array([56, 57, 10])
Run Code Online (Sandbox Code Playgroud)