如何使用新的 NumPy 随机数生成器?
How to use the new NumPy random number generator?
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 文档和随机采样文章除外)都非常有趣!
default_rng()
不是单身人士。它使 new 生成器由默认 BitGenerator class 的 new 实例支持。引用 docs:
Construct a new Generator with the default BitGenerator (PCG64).
...
If seed is not a BitGenerator or a Generator, a new BitGenerator is instantiated. This function does not manage a default global instance.
这也可以通过经验来检验:
In [1]: import numpy
In [2]: numpy.random.default_rng() is numpy.random.default_rng()
Out[2]: False
这很贵。你通常应该在你的程序中调用一次 default_rng()
并将生成器传递给任何需要它的东西。 (是的,这很尴尬。)
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 文档和随机采样文章除外)都非常有趣!
default_rng()
不是单身人士。它使 new 生成器由默认 BitGenerator class 的 new 实例支持。引用 docs:
Construct a new Generator with the default BitGenerator (PCG64).
...
If seed is not a BitGenerator or a Generator, a new BitGenerator is instantiated. This function does not manage a default global instance.
这也可以通过经验来检验:
In [1]: import numpy
In [2]: numpy.random.default_rng() is numpy.random.default_rng()
Out[2]: False
这很贵。你通常应该在你的程序中调用一次 default_rng()
并将生成器传递给任何需要它的东西。 (是的,这很尴尬。)