我有两个列表,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]]
Run Code Online (Sandbox Code Playgroud)
如代码中所示,我显然是因为它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]
Run Code Online (Sandbox Code Playgroud)
有没有办法使用以前的表示法使这个工作,而不是添加第三个变量?
numpy数组和列表之间的区别:
lst[cp:] # makes a copy
array[cp:] # no copy
Run Code Online (Sandbox Code Playgroud)
请注意,即使使用临时变量,由于缺少复制,实际上也无法帮助您:
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]]
Run Code Online (Sandbox Code Playgroud)
所以我们可以重新编写你的行来强制副本在右边 - 然后事情应该成功了:
parents[0][cp:], parents[1][cp:] = parents[1][cp:].copy(), parents[0][cp:].copy()
Run Code Online (Sandbox Code Playgroud)
还要注意的是,如果你真的要聪明一点,并在这个过程中节省一些操作,你只真的需要一个副本:
parents[0][cp:], parents[1][cp:] = parents[1][cp:], parents[0][cp:].copy()
Run Code Online (Sandbox Code Playgroud)
基本上这有以下操作顺序:
parents[1][cp:](v1为了讨论而调用它)parents[0][cp:]然后复制它(调用它c2)v1给parents[0][cp:](注意这不会c2因副本而改变)c2给parents[1][cp:].这会影响v1,但v1已经被复制到它的最终目的地,所以没关系.| 归档时间: |
|
| 查看次数: |
96 次 |
| 最近记录: |