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

Idr*_*Idr 85 python random numpy

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

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

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

r = np.random.randint(3, size=(100, 2000)) - 1
Run Code Online (Sandbox Code Playgroud)

Rob*_*ern 176

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])
Run Code Online (Sandbox Code Playgroud)

  • 这主要是为了养成良好的习惯.你现在可能不需要独立的流,但Sven-6-months-from-now可能.如果您编写库以直接使用`numpy.random`中的方法,则以后不能创建独立的流.为了控制PRNG流,编写库也更容易.总有多种方法可以进入您的库,每种方法都应该有一种控制种子的方法.传递PRNG对象是一种更简洁的方法,而不是依赖于`numpy.random.seed()`.不幸的是,这个评论框太短,无法包含更多示例.:-) (48认同)
  • 描述Robert的基本原理的另一种方法是:使用numpy.random.seed使用全局变量来保持PRNG状态,并且全局变量不良的相同标准原因适用于此处. (21认同)
  • 如果您希望PRNG独立,请不要将它们与任何东西一起播种.只需使用没有参数的`numpy.random.RandomState()`.这将使状态具有从操作系统设施中为这些事物绘制的唯一值(UNIX机器上的`/ dev/urandom`和那里的Windows等效项).如果`numpy.random.RandomState(1234567890)`不适合您,请准确显示您键入的内容以及您收到的错误消息. (7认同)
  • 你对你的推荐有任何理由吗?`numpy.random.seed()`有什么问题?我知道它不是线程安全的,但如果你不需要线程安全,它真的很方便. (6认同)
  • 不是个好主意.使用`numpy.random.RandomState()`没有参数可以获得最佳结果. (4认同)
  • PRNG = 伪随机数生成器(对于那些想知道这些字母代表什么的人,请参阅维基百科以获取更多信息。) (3认同)
  • 从一开始就使用自己的“RandomState”实例的另一个原因是它将有助于创建可重现的单元测试。正如我发现的那样,如果您将 numpy 导入到 unittest 中并执行 numpy.random.seed,它*不会*更改您正在测试的模块中的种子! (2认同)

Sve*_*ach 78

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

numpy.random.seed(42)
Run Code Online (Sandbox Code Playgroud)

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

  • 当我没有注意时,有人偷偷溜进了`numpy.random.seed()`函数.:-)我故意将它从原始模块中删除.我建议人们使用他们自己的`RandomState`实例并传递这些对象. (37认同)
  • 这与使用`random.seed`与使用Python标准库中的`random.Random`对象相同.如果您使用`random.seed`或`numpy.random.seed`,您将在您的代码和您正在调用的任何代码中播放*all*random实例,或者在与您相同的会话中运行的任何代码.如果那些东西依赖于那些实际上是随机的东西,那么你就会遇到问题.如果部署设置随机种子的代码,则可能会引入安全漏洞. (12认同)
  • @deprecated:我很感谢罗伯特的工作,但他的工作并不能代替给出推荐理由.此外,如果不鼓励使用`numpy.random.seed()`,则应在[文档]中提及(http://docs.scipy.org/doc/numpy/reference/generated/numpy.random. seed.html#numpy.random.seed).显然,NumPy的其他贡献者并不赞同罗伯特的观点.根本没有违法行为,我只是好奇. (10认同)
  • 罗伯特是numpy的主要贡献者.我想我们应该给他的意见一些重量. (6认同)
  • @asmeurer任何出于安全目的使用伪随机数生成器的人可能都不知道他们在做什么。 (2认同)
  • @JAB一种安全但资源高效的方法是对种子使用真正的随机性,对下一个序列使用伪随机性 (2认同)

小智 9

我只是想澄清一些有关 @Robert Kern 答案的事情,以防不清楚。即使您确实使用了它,RandomState您也必须在每次调用 numpy random 方法(如 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])
Run Code Online (Sandbox Code Playgroud)