一致地创建相同的随机numpy数组

110 投票
6 回答
95382 浏览
提问于 2025-04-16 16:41

我在等另一个开发者完成一段代码,这段代码会返回一个形状为(100,2000)的数组,里面的值要么是-1,要么是0,要么是1。

在这段时间里,我想随机创建一个具有相同特征的数组,这样我就可以提前开始我的开发和测试。问题是,我希望这个随机创建的数组每次都是一样的,这样我在重新运行我的程序时,就不会测试到一个每次都在变化的数组。

我可以这样创建我的数组,但有没有办法让它每次都保持一致呢?我可以把这个对象保存起来再读取,但我在想有没有其他的方法。

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

6 个回答

9

我想澄清一下关于@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])
216

创建你自己的 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])
100

简单来说,你可以用一个固定的值来给随机数生成器“播种”,比如:

numpy.random.seed(42)

这样做的话,你每次得到的随机数序列都是一样的。

这个函数会给全局默认的随机数生成器播种,之后在调用 numpy.random 里的任何函数时,都会使用并改变它的状态。对于很多简单的情况,这样做是没问题的,但它属于全局状态,使用全局状态会带来一些麻烦。如果想要更干净的解决方案,可以看看下面罗伯特·科恩的回答。

撰写回答