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)
我的问题是:
这2个有什么区别?
如何生成样本Generator?
文档中提到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)
| 归档时间: |
|
| 查看次数: |
578 次 |
| 最近记录: |