【问题标题】:Swap two values in a numpy array.交换 numpy 数组中的两个值。
【发布时间】:2014-05-15 20:36:39
【问题描述】:

有没有比以下代码更有效地交换 numpy 一维数组的两个值的方法?

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

【问题讨论】:

标签: python numpy scipy swap


【解决方案1】:

您可以使用元组解包。元组解包可以避免在代码中使用临时变量(实际上我相信 Python 代码本身在后台使用临时变量,但它的级别要低得多,因此速度要快得多)。

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

我已将此问题标记为重复,the dupe post 中的答案有更多详细信息。

【讨论】:

  • 这在 NumPy 数组上似乎不安全。试试: A = np.ones((2,2)); A[1,:] += 1; A[0,:], A[1,:] = A[1,:], A[0,:]; A 现在全是 2s。
  • @lewistrick 的答案将适用于任意维度的 numpy 数组。此答案将在维度 2 或更高维度上失败。
  • 这可能适用于单个值(从最严格的意义上回答问题),但不适用于值组。试试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 有效。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-01
    • 2019-04-22
    • 1970-01-01
    • 2011-06-18
    相关资源
    最近更新 更多