如何访问numpy默认全局随机数生成器

时间:2017-02-01 17:03:36

标签: python python-3.x numpy numpy-random

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

后面的RandomState对象

PS:我正在使用python-3.4

3 个答案:

答案 0 :(得分:2)

numpy.randomnumpy.random.mtrand导入*,这是一个用Cython编写的扩展模块。 source code表示全局状态存储在变量_rand中。这个变量is not imported放入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

答案 1 :(得分:2)

除了kazemakase建议的内容之外,我们可以利用numpy.random.random等模块级函数实际上是隐藏numpy.random.RandomState的方法,直接从__self__拉出numpy_default_rng = numpy.random.random.__self__ 那些方法:

var string = "blahmehfoobar hello random stuff here blahblah blegh coding stackover flow computersc ience";

var textToFind = ["blah", "random stuff", "stackover flow comput"];
var counter = 0;

for (var i = 0; i < textToFind.length; i++){
    var text = textToFind[i];
    console.log('finding: ' + text);
    for (var j = 0; j < string.length; j++){
        if (text.charAt(0) === string.charAt(j)){
          console.log(text.length +" characters: "+string.substring(j, j+text.length) )
    
            if (text == string.substring(j, j+text.length)){
            console.log(text+" found!");
                counter++;
            }
        }
    }
}

console.log(counter);

答案 2 :(得分: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))