我得到了以下代码:
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 这表明它必须是因为这些随机抽取基于机器时钟,并且因为命令在几乎相同的实例中执行,所以绘制相同的数字。但如果是这种情况,为什么我会在终端中运行相同的结果(即逐个输入行)?
总结一下,我有两个问题: - 如何修复代码? - 确实是机器时间问题'导致这个?
提前致谢!
答案 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_data1
和rand_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]]