2

我在尝试替换 numpy 数组中的值并遇到一个非常奇怪的行为时遇到了很糟糕的情况,我希望有人能解释一下。本质上,我想在遗传算法中进行交叉操作。这是一个简单的例子。我有一个 2 X 10 数组,并希望将第 1 行到第 5 列的所有值与第 2 行到第 5 列的值交换。代码如下:

z=np.random.uniform(low=0,high=1,size=(2,10))
zcopy = z
print z

[[ 0.77488523  0.39966358  0.63233664  0.77093136  0.04102615  0.98984184
0.43402537  0.0910648   0.28037032  0.76654885]
[ 0.49980878  0.28161905  0.71972029  0.01208004  0.87851569  0.16853681
0.96325992  0.90886083  0.12344231  0.83665396]]

z[1,range(4)] = zcopy[0,range(4)]
print z

[[ 0.77488523  0.39966358  0.63233664  0.77093136  0.04102615  0.98984184
0.43402537  0.0910648   0.28037032  0.76654885]
[ 0.77488523  0.39966358  0.63233664  0.77093136  0.87851569  0.16853681
0.96325992  0.90886083  0.12344231  0.83665396]]

如您所见,它只是将第 1 行的所有内容复制到两行中。但是,如果我没有指定另一个数组的子集,而只是给它说整数,它就可以完美地工作

z[1,range(4)] = range(4)
print z
[[ 0.77488523  0.39966358  0.63233664  0.77093136  0.04102615  0.98984184
0.43402537  0.0910648   0.28037032  0.76654885]
[ 0.          1.          2.          3.          0.87851569  0.16853681
0.96325992  0.90886083  0.12344231  0.83665396]]

我比较困惑。有谁知道如何解决这个问题?

4

2 回答 2

2

尝试这个

z=np.random.uniform(low=0,high=1,size=(2,10))
z[:,range(4)] = z[::-1,range(4)]

[[ 0.30778241  0.04832341  0.616925    0.81325565  0.44578265  0.59024722 0.32147695  0.68434105  0.47430297  0.06256859]
 [ 0.58522801  0.23922353  0.15388696  0.46400394  0.33126422  0.54651948 0.34724277  0.46974174  0.68646707  0.62549495]]

[[ 0.58522801  0.23922353  0.15388696  0.46400394  0.44578265  0.59024722 0.32147695  0.68434105  0.47430297  0.06256859]
 [ 0.30778241  0.04832341  0.616925    0.81325565  0.33126422  0.54651948 0.34724277  0.46974174  0.68646707  0.62549495]]
于 2012-07-05T21:33:09.967 回答
2

这里似乎有两个问题。

  1. “为什么不zcopy = z复制?”
  2. “为什么不z[1,range(4)] = zcopy[0,range(4)]交换前四列的值?”

第一个问题的答案是,在 Python 中为变量名赋值不会产生副本。Python 中的变量只是对象的标签;给对象一个新标签根本不会改变对象本身。如果要复制 numpy 数组,具体来说,可以使用该copy方法,该方法返回数组的新副本。如:

zcopy = z.copy()

第二个问题的答案是您的代码仅分配一组值:z[1, range(4)]. 如果要更改两行,则必须分配给两行!在许多语言中,您可以使用tmp变量来执行此操作,但 python 提供了一种无需临时变量即可交换值的优雅方式:

>>> z[1, range(4)], z[0, range(4)] = z[0, range(4)], z[1, range(4)]

nye17的答案有点干净,但它做同样的事情。

于 2012-07-05T21:30:05.257 回答