一致地创建相同的随机numpy数组
我在等另一个开发者完成一段代码,这段代码会返回一个形状为(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
里的任何函数时,都会使用并改变它的状态。对于很多简单的情况,这样做是没问题的,但它属于全局状态,使用全局状态会带来一些麻烦。如果想要更干净的解决方案,可以看看下面罗伯特·科恩的回答。