【发布时间】: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 文档和随机采样文章除外)都非常有趣!
【问题讨论】:
-
(顺便说一句,不要将你的类命名为
object。object是所有 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