numpy和操作a,b = b,a

时间:2017-02-15 00:10:59

标签: 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]]

如代码所示,我明显收到错误,因为它在分配结束前在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]

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

1 个答案:

答案 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已被复制到其最终目的地,以便确定。