2

我得到以下代码:

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 这表明这一定是因为这些随机抽取是基于机器时钟的,并且因为命令在几乎相同的实例中执行,所以一个抽取相同的数字。但如果是这样的话,为什么我在终端中运行它会得到相同的结果(即逐个键入行)?

总而言之,我有两个问题: - 如何修复我的代码?- 确实是导致这种情况的机器时间“问题”吗?

提前致谢!

4

2 回答 2

4

仅分配rand_draw2 = rand_draw1 不会创建副本,它只是将名称绑定到已绑定到rand_draw2同一对象rand_draw1

>>> rand_draw2 = rand_draw1
>>> rand_draw2 is rand_draw1
True

相反,您需要显式复制 rand_draw1,并将副本分配给rand_draw2

>>> rand_draw1 = np.random.rand(5, 4)
>>> rand_draw2 = rand_draw1.copy()
>>> rand_draw2[0:2] = np.random.rand(2, 4)
>>> rand_draw1
array([[ 0.08254004,  0.51848814,  0.69348487,  0.44053008],
       [ 0.75273107,  0.64677024,  0.78397813,  0.12768647],
       [ 0.37552669,  0.8365069 ,  0.44490398,  0.3943413 ],
       [ 0.27263619,  0.40379047,  0.43227555,  0.61552473],
       [ 0.55214161,  0.21380748,  0.34122889,  0.44029075]])
>>> rand_draw2
array([[ 0.26229975,  0.02754367,  0.7989174 ,  0.94619982],
       [ 0.40869498,  0.01327566,  0.06437938,  0.94647506],
       [ 0.37552669,  0.8365069 ,  0.44490398,  0.3943413 ],
       [ 0.27263619,  0.40379047,  0.43227555,  0.61552473],
       [ 0.55214161,  0.21380748,  0.34122889,  0.44029075]])

有关Python 中名称如何工作的很好的解释,请参见此处。

于 2014-08-01T09:01:08.500 回答
2

在 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()方法。请注意,根据要求,您可能需要改为 a 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]]
于 2014-08-01T09:00:35.143 回答