numpy.random 与 numpy.random.Generate 有啥区别

Posted

技术标签:

【中文标题】numpy.random 与 numpy.random.Generate 有啥区别【英文标题】:What's the difference between numpy.random vs numpy.random.Generatenumpy.random 与 numpy.random.Generate 有什么区别 【发布时间】:2021-01-17 10:27:15 【问题描述】:

我最近一直在尝试模拟一些蒙特卡洛斯模拟,结果遇到了numpy.random。检查指数生成器的documentation,我注意到这是页面中的警告,它说明了这一点

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

我的问题是:

    这两个有什么区别?

    如何使用Generator生成样本?

【问题讨论】:

相关:***.com/q/61352259/270986 @olenscki 刚刚看到您对具有相同数字的连续数字的评论。你确定你需要多帧吗?也许\beginframe \beginfigure \includegraphics&lt;1&gt;example-image-a \includegraphics&lt;2&gt;example-image-b \captiontext \endfigure \endframe 会更容易? @samcarter_is_at_topanswers.xyz 我试图显示同一张图片并更改下面的文字。如果我有 2 张图片和 1 个文字,您建议的这个可能会更容易,不是吗? @olenscki 要更改文本,也许\only&lt;1&gt;text first slide\only&lt;2&gt;text second slide 更容易? (操纵计数器来减少数字有点冒险,因为你会破坏交叉引用) 【参考方案1】:

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

系统更改的最佳理由可能是 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])

【讨论】:

感谢您的回复!我有最后一个问题:他们为什么要这样做? 我认为 NEP 19 很好地解释了这一点。遗留系统对可重复性做出了一些承诺,而这些承诺结果严重限制了进一步的开发和改进。因此,如果你想在随机系统上继续开发,你有两个选择:打破承诺,或者创建一个新系统来替换旧系统(但保留旧系统以避免破坏现有代码)。并且创建一个新系统提供了一些机会来做一些其他的好事,比如允许不同的核心比特生成器。 对现有代码进行根本性更改非常棘手。很容易弄坏东西。从头开始开发一个新包更容易,并在“朋友”中测试它(作为它自己的 github 项目),然后在稳定后将其移植到主流包。

以上是关于numpy.random 与 numpy.random.Generate 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

Python 中 numpy.random.rand 与 numpy.random.randn 之间的区别

numpy.random.randn()与rand()的区别

正态分布与numpy.random.normal函数

正态分布与numpy.random.normal函数

numpy.random.choice和random.choice的输入参数有区别吗?

numpy random.shuffle()和random.permutation()