在numpy数组中交换两个值。

34

有没有比以下代码更高效的方法来交换numpy 1D数组中的两个值?

input_seq = arange(64)

ix1 = randint(len(input_seq))
ixs2 = randint(len(input_seq))

temp = input_seq[ix2]
input_seq[ix2] = input_seq[ix1] 
input_seq[ix1] = temp

1
可能是在Python中交换两个变量的标准化方法是什么?的重复问题。 - Ffisegydd
你能否提供一些输入和预期输出的简短示例? - Daniel
10
这个问题绝对不是那个其他问题的重复,因为这个问题是特别针对 numpy 的... - smheidrich
2个回答

51

我看到你正在使用numpy数组。在这种情况下,你还可以这样做:

input_seq[[ix1, ix2]] = input_seq[[ix2, ix1]]

34
您可以使用元组解包。元组解包允许您在代码中避免使用临时变量(实际上,我相信Python的代码本身在幕后使用了一个临时变量,但它处于更低的级别,因此更快)。
input_seq[ix1], input_seq[ix2] = input_seq[ix2], input_seq[ix1]

我已将此问题标记为重复,答案在重复的帖子中有更多细节。


17
对于 NumPy 数组而言,这种写法似乎不太安全。可以尝试以下方法:A = np.ones((2,2)); A[1,:] += 1; A[0,:], A[1,:] = A[1,:], A[0,:];现在 A 数组中全部都是 2。 - Thomas Arildsen
15
@lewistrick的答案适用于任意维度的numpy数组。这个答案在二维或更高维度上会失败。 - Joel
1
这可能适用于单个值(在最严格的意义上回答问题),但不适用于值组。尝试 a=np.array([1,2,3]); b=np.array([4,5,6,7]); a[0:3], b[0:3] = b[0:3], a[0:3]。结果将是b中的前3个值被移动到a中,但a的值不会复制到b中。这可能是由于传递指针(即a被b值覆盖,然后复制到b中)。这就是我认为这个问题有趣的原因。添加.copy()可以帮助,例如a, b[0:3] = (b[0:3]).copy(), a可以工作。 - sh37211

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接