在numpy中绘制相同的随机数

时间:2014-08-01 08:55:55

标签: python numpy random random-seed

我得到了以下代码:

import numpy as np
rand_draw1 = np.random.rand(5,4)
rand_draw2 = rand_draw1
rand_draw2[0:2,0:4] = np.random.rand(2,4)

我的目的是让变量rand_draw1和rand_draw2相同,但前两行除外。然而,即使是前两行,它们也完全相同。

最初我认为这个问题解决了我的问题: Random Number Generation - Same Number returned 这表明它必须是因为这些随机抽取基于机器时钟,并且因为命令在几乎相同的实例中执行,所以绘制相同的数字。但如果是这种情况,为什么我会在终端中运行相同的结果(即逐个输入行)?

总结一下,我有两个问题: - 如何修复代码? - 确实是机器时间问题'导致这个?

提前致谢!

2 个答案:

答案 0 :(得分:3)

只需指定rand_draw2 = rand_draw1 创建副本,它只需将名称rand_draw2绑定到已绑定到{{1的同一对象 }}:

rand_draw1

相反,您需要明确复制 >>> rand_draw2 = rand_draw1 >>> rand_draw2 is rand_draw1 True ,并将副本分配给rand_draw1

rand_draw2

参见例如here可以很好地解释Python中的名称是如何工作的。

答案 1 :(得分:1)

在python中,赋值不会创建对象的副本,因此,标签rand_data1rand_data2当前都引用相同的对象。因此,当您编辑第二个变量(rand_data2)时,第一个 似乎 会自动更新。

>>> import numpy as np
>>> rand_draw1 = np.random.rand(5,4)
>>> rand_draw2 = rand_draw1
>>> print id(rand_draw2), id(rand_draw2)
40407360 40407360

要创建副本,请使用.copy()方法。请注意,根据要求,您可能需要执行deepcopy

>>> rand_draw2 = rand_draw1.copy()
>>> id(rand_draw2)
41090720

现在你可以做到

>>> rand_draw2[0:2,0:4] = np.random.rand(2,4)
>>> print rand_draw1
[[ 0.46171859  0.6766379   0.97746539  0.15278117]
 [ 0.93963979  0.19853993  0.29979121  0.10237192]
 [ 0.15283647  0.21643831  0.21335029  0.42910395]
 [ 0.92836103  0.03468904  0.40524073  0.90284648]
 [ 0.05225297  0.83740986  0.43472966  0.08430102]]
>>> print rand_draw2
[[ 0.37539354  0.71703056  0.76480003  0.95918987]
 [ 0.15026104  0.04198227  0.58959412  0.45517846]
 [ 0.15283647  0.21643831  0.21335029  0.42910395]
 [ 0.92836103  0.03468904  0.40524073  0.90284648]
 [ 0.05225297  0.83740986  0.43472966  0.08430102]]