9

我需要创建一个将随机数生成器(即numpy.random.RandomState对象)作为参数的类。在未指定此参数的情况下,我想将其分配给 numpy 在我们运行时使用的随机生成器numpy.random.<random-method>。如何访问这个全局生成器?目前我只是通过将模块对象分配为随机生成器来做到这一点(因为它们共享方法/鸭子类型)。但是,这会在腌制(无法腌制模块对象)和深度复制时导致问题。我想在 numpy.random 后面使用 RandomState 对象

PS:我正在使用 python-3.4

4

3 回答 3

4

正如 kazemakase 所建议的那样,我们可以通过直接从其中一种方法中提取来利用这样的模块级函数numpy.random.random实际上是隐藏方法的事实:numpy.random.RandomState__self__

numpy_default_rng = numpy.random.random.__self__
于 2017-02-01T17:30:26.530 回答
2

numpy.randomimport * from numpy.random.mtrand,这是一个用 Cython 编写的扩展模块。源代码显示全局状态存储在变量中_rand。这个变量没有被导入numpy.random作用域中,但是你可以直接从 mtrand 获取它。

import numpy as np
from numpy.random.mtrand import _rand as global_randstate

np.random.seed(42)
print(np.random.rand())
# 0.3745401188473625

np.random.RandomState().seed(42)  # Different object, does not influence global state
print(np.random.rand())
# 0.9507143064099162

global_randstate.seed(42)  # this changes the global state
print(np.random.rand())
# 0.3745401188473625
于 2017-02-01T17:25:40.763 回答
0

我不知道如何访问全局状态。但是,您可以使用 RandomState 对象并将其传递。它附加了随机分布,因此您将它们称为方法。

例子:

import numpy as np

def computation(parameter, rs):
    return parameter*np.sum(rs.uniform(size=5)-0.5)

my_state = np.random.RandomState(seed=3)

print(computation(3, my_state))
于 2017-02-01T17:40:38.467 回答