【问题标题】:How to use the new NumPy random number generator?如何使用新的 NumPy 随机数生成器?
【发布时间】:2020-08-23 20:00:03
【问题描述】:

NumPy 现在建议新代码使用 defacult_rng() 实例而不是 numpy.random 的事实让我开始思考应该如何使用它来产生良好的结果,无论是在性能方面还是在统计方面。

第一个例子是我最初想写的:

import numpy as np

class fancy_name():
  def __init__(self):
    self.rg = np.random.default_rng()
    self.gamma_shape = 1.0
    self.gamma_scale = 1.0

  def public_method(self, input):
    # Do intelligent stuff with input
    return self.rg.gamma(self.gamma_shape, slef.gamma_scale)

但我也考虑过在每个函数调用中创建一个新实例:

import numpy as np

class fancy_name():
  def __init__(self):
    self.gamma_shape = 1.0
    self.gamma_scale = 1.0

  def public_method(self, input):
    # Do intelligent stuff with input
    rg = np.random.default_rng()
    return rg.gamma(self.gamma_shape, slef.gamma_scale)

第三种选择是在函数调用中将 rng 作为参数传递。这样,相同的 rng 也可以用于代码的其他部分。

这用于将经常调用以进行采样的模拟环境,例如转换时间。

我想问题是这三种方法中的任何一种是否存在论据,是否存在某种实践?

此外,任何对使用这些随机数生成器的更深入解释的参考(NumPy 文档和随机采样文章除外)都非常有趣!

【问题讨论】:

  • (顺便说一句,不要将你的类命名为 objectobject 是所有 Python 类的内置基类。这样做不会立即破坏任何东西,但它仍然很糟糕想法)
  • @Iguananaut Offcourse,只是一个愚蠢的占位符。感谢您指出,所以它不会引起混淆。
  • 我认为您的问题没有一个正确答案,因为这取决于用例。但在我自己的代码中,我可能会做这样的事情。定义你的__init__,比如def __init__(self, rng=None),然后在方法体中定义if rng is None: rng = np.default_rng(); self.rng = rng。现在您可以选择传入不同的 RNG 实例,否则它将使用默认值。我认为为每个函数调用创建一个没有多大意义。

标签: python random numpy-random


【解决方案1】:

default_rng() 不是单身人士。它创建了一个由默认 BitGenerator 类的 new 实例支持的 new 生成器。引用docs

使用默认的 BitGenerator (PCG64) 构造一个新的生成器。

...

如果种子不是 BitGenerator 或 Generator,则实例化 new BitGenerator。 此函数不管理默认全局实例。

这也可以通过经验来测试:

In [1]: import numpy

In [2]: numpy.random.default_rng() is numpy.random.default_rng()
Out[2]: False

这很贵。你通常应该在你的程序中调用一次default_rng() 并将生成器传递给任何需要它的东西。 (是的,这很尴尬。)

【讨论】:

    猜你喜欢
    • 2020-01-11
    • 1970-01-01
    • 1970-01-01
    • 2019-06-24
    • 2019-04-25
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    相关资源
    最近更新 更多