我正在尝试更换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]]
我很困惑。有没有人知道如何解决这个问题?
答案 0 :(得分:2)
这里似乎有两个问题。
zcopy = z
制作副本?”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的答案有点干净,但它也做了同样的事情。
答案 1 :(得分: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]]