numpy.random和numpy.random.Generator之间有什么区别?

9
最近我一直在尝试模拟一些蒙特卡罗模拟,并了解到了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

我的问题是:

  1. 这两者之间有什么区别?

  2. 如何使用Generator生成样本?


相关链接:https://dev59.com/kLroa4cB1Zd3GeqPl4Iv - Mark Dickinson
@olenscki,刚看到你关于连续数字相同的评论。你确定需要多个帧吗?也许\begin{frame} \begin{figure} \includegraphics<1>{example-image-a} \includegraphics<2>{example-image-b} \caption{text} \end{figure} \end{frame}会更容易些? - samcarter_is_at_topanswers.xyz
@samcarter_is_at_topanswers.xyz 我试图展示相同的图片并更改下面的文本。如果我有两张图片和一个文本,你建议的这个可能会更容易,对吗? - olenscki
@olenscki 要更改文本,也许使用\only<1>{第一张幻灯片文本}\only<2>{第二张幻灯片文本}会更容易?(通过操作计数器来减少图表编号有些冒险,因为这样会破坏交叉引用) - samcarter_is_at_topanswers.xyz
1个回答

8
文档中提到的Generator是一个类,在NumPy 1.17中引入:它是核心类,负责将底层位生成器的值适配为从各种分布中生成样本的方法。numpy.random.exponential是(现在)传统的Mersenne-Twister基于随机框架的一部分。您可能不必担心传统函数很快被移除 - 这样做会破坏大量代码,但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()

此时,my_generatornumpy.random.Generator 的一个实例:

>>> type(my_generator)
<class 'numpy.random._generator.Generator'>

你可以使用 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])

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

>>> my_generator.integers(0, 100, size=3)
array([56, 57, 10])

谢谢您的回复!我还有一个问题:他们为什么要这样做? - olenscki
我认为NEP 19解释得相当清楚。传统系统对可重复性做出了一些承诺,但这些承诺事实证明严重限制了进一步的开发和改进。因此,在这个时候,如果你想继续在随机系统上进行开发,你有两个选择:打破承诺或创建一个新系统来替换旧系统(但保留旧系统以避免破坏现有代码)。创建一个新系统提供了一些机会来做一些其他好的事情,比如允许不同的核心位生成器。 - Mark Dickinson
对现有代码进行基本更改是棘手的。很容易出错。从头开始开发一个新的软件包,并在“朋友”(作为自己的github项目)中测试它,然后在稳定后将其移植到主流软件包中会更容易些。 - hpaulj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接