始终创建相同的随机numpy数组

时间:2011-04-29 19:10:41

标签: python random numpy

我正在等待另一位开发人员完成一段代码,该代码将返回一个形状为np的数组(100,2000),其值为-1,0或1。

与此同时,我想随机创建一个具有相同特征的数组,这样我就可以在开发和测试方面领先一步。问题是我希望这个随机创建的数组每次都是相同的,所以我不会测试每次重新运行我的进程时不断更改其值的数组。

我可以像这样创建我的数组,但有没有办法创建它,以便每次都相同。我可以腌制物体并解开它,但想知道是否还有另一种方式。

r = np.random.randint(3, size=(100, 2000)) - 1

5 个答案:

答案 0 :(得分:167)

使用您选择的种子创建自己的numpy.random.RandomState()实例。不要使用numpy.random.seed(),除了解决不允许您传递自己的RandomState实例的不灵活的库。

[~]
|1> from numpy.random import RandomState

[~]
|2> prng = RandomState(1234567890)

[~]
|3> prng.randint(-1, 2, size=10)
array([ 1,  1, -1,  0,  0, -1,  1,  0, -1, -1])

[~]
|4> prng2 = RandomState(1234567890)

[~]
|5> prng2.randint(-1, 2, size=10)
array([ 1,  1, -1,  0,  0, -1,  1,  0, -1, -1])

答案 1 :(得分:78)

简单地使用固定值为随机数生成器播种,例如

numpy.random.seed(42)

这样,您将始终获得相同的随机数序列。

答案 2 :(得分:3)

如果您正在使用依赖于随机状态的其他函数,则不能只设置和整体种子,而应创建一个函数来生成随机数字列表并将种子设置为函数的参数。这不会干扰代码中的任何其他随机生成器:

# Random states
def get_states(random_state, low, high, size):
    rs = np.random.RandomState(random_state)
    states = rs.randint(low=low, high=high, size=size)
    return states

# Call function
states = get_states(random_state=42, low=2, high=28347, size=25)

答案 3 :(得分:1)

我只想澄清关于@Robert Kern答案的一些内容,以防万一不清楚。即使您确实使用RandomState,也必须在每次调用numpy随机方法时都要初始化它,就像在Robert的示例中那样,否则您将获得以下结果。

Python 3.6.9 |Anaconda, Inc.| (default, Jul 30 2019, 19:07:31) 
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> prng = np.random.RandomState(2019)
>>> prng.randint(-1, 2, size=10)
array([-1,  1,  0, -1,  1,  1, -1,  0, -1,  1])
>>> prng.randint(-1, 2, size=10)
array([-1, -1, -1,  0, -1, -1,  1,  0, -1, -1])
>>> prng.randint(-1, 2, size=10)
array([ 0, -1, -1,  0,  1,  1, -1,  1, -1,  1])
>>> prng.randint(-1, 2, size=10)
array([ 1,  1,  0,  0,  0, -1,  1,  1,  0, -1])

答案 4 :(得分:0)

重要的是要了解什么是随机生成器的种子以及何时/如何在代码中设置它(请检查here,以更好地解释种子的数学含义)。

为此,您需要执行以下操作来设置种子:

random_state = np.random.RandomState(seed=your_favorite_seed_value)

那么重要的是从random_state而不是np.random生成随机数。即您应该这样做:

random_state.randint(...)

代替

np.random.randint(...) 

这将创建一个RandomState()的新实例,并基本上使用您的计算机内部时钟来设置种子。