numpy和操作a,b = b,a

Man*_*nas 1 python numpy

我有两个列表,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)

有没有办法使用以前的表示法使这个工作,而不是添加第三个变量?

mgi*_*son 9

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)
  • 分配v1parents[0][cp:](注意这不会c2因副本而改变)
  • 分配c2parents[1][cp:].这影响v1,但v1已经被复制到它的最终目的地,所以没关系.