我有两个列表a b
,其中包含随机数量的元素(让我们说8),我想在点cp
中拆分。之后,我希望将cp
之前的部分保留原样,然后在cp
之后更改其他部分中的部分。
我使用以下代码:
cp = 4
a = [1, 3, 2, 4, 5, 8, 7, 6]
b = [3, 1, 5, 6, 2, 8, 4, 7]
parents = np.array([a,b])
parents[0][cp:], parents[1][cp:] = parents[1][cp:], parents[0][cp:]
print parents
# Print result:
# [[1 3 2 4 5 8 7 6]
# [3 1 5 6 5 8 7 6]]
如代码所示,我明显收到错误,因为它在分配结束前在parents[0]
中分配了子数组的值。
如果我使用传统的python列表,这似乎工作正常:
a = [1,3,2,4, 5,8,7,6]
b = [3,1,5,6, 2,8,4,7]
a[cp:] , b[cp:] = b[cp:], a[cp:]
print a,b
# Print result:
# [1, 3, 2, 4, 2, 8, 4, 7] [3, 1, 5, 6, 5, 8, 7, 6]
有没有办法使用之前的表示法来完成这项工作,而不是添加第三个变量?
答案 0 :(得分:9)
numpy数组和列表之间的区别:
lst[cp:] # makes a copy
array[cp:] # no copy
请注意,即使使用临时变量,由于缺少复制,实际上并没有帮助你:
import numpy as np
cp = 4
a = [1, 3, 2, 4, 5, 8, 7, 6]
b = [3, 1, 5, 6, 2, 8, 4, 7]
parents = np.array([a,b])
tmp = parents[0][cp:]
parents[0][cp:] = parents[1][cp:]
parents[1][cp:] = parents[0][cp:]
print(parents)
# [[1 3 2 4 2 8 4 7]
# [3 1 5 6 2 8 4 7]]
因此我们可以重新编写您的行以强制复制到右侧 - 然后事情应该可以正常运行:
parents[0][cp:], parents[1][cp:] = parents[1][cp:].copy(), parents[0][cp:].copy()
另请注意,如果您真的想要聪明并在此过程中保存一些操作,那么您只需 需要一份副本:
parents[0][cp:], parents[1][cp:] = parents[1][cp:], parents[0][cp:].copy()
基本上,它具有以下操作顺序:
parents[1][cp:]
创建视图(为了讨论而将其称为v1
)parents[0][cp:]
创建视图,然后将其复制(称之为c2
)v1
分配给parents[0][cp:]
(请注意,由于副本不会更改c2
)c2
分配给parents[1][cp:]
。此将影响v1
,但v1
已被复制到其最终目的地,以便确定。