You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何无需多层for循环从nd numpy数组中移除反向元素对之一?

无需多层循环移除numpy数组中互为反向的元素对

原始数组:

import numpy as np
arr = np.array([[0,2],[0,3],[1,4],[2,0],[2,3],[3,0],[3,2],[4,1]])

处理后目标数组:

[[0 2] [0 3] [1 4] [2 3]]

方法:利用排序+矢量化去重

核心思路是把互为反向的元素对通过行内排序转换成相同形式,再通过numpy的矢量化去重方法保留唯一的原始元素对,全程无需多层循环。

完整代码实现:

import numpy as np

# 原始数组
arr = np.array([[0,2],[0,3],[1,4],[2,0],[2,3],[3,0],[3,2],[4,1]])

# 1. 对每个元素对的行内元素排序,将反向对标准化为相同形式
sorted_pairs = np.sort(arr, axis=1)

# 2. 获取排序后唯一行的原始索引(保留每个唯一对第一次出现的位置)
_, unique_indices = np.unique(sorted_pairs, axis=0, return_index=True)

# 3. 根据索引提取原始数组中的对应行,得到最终结果
result = arr[unique_indices]

print(result)
# 输出:[[0 2]
#        [0 3]
#        [1 4]
#        [2 3]]

原理说明

  • np.sort(arr, axis=1):将每个元素对的两个数按从小到大排序,比如[2,0]会变成[0,2],和原数组中的[0,2]排序后完全一致,让互为反向的对成为相同的标准化形式。
  • np.unique(..., return_index=True):找到排序后数组中的唯一行,并返回这些行在原排序数组中第一次出现的索引,通过该索引从原始数组中提取未排序的元素对,保证保留原始数组中先出现的那个元素对。

额外调整

如果需要保留每个反向对中后出现的元素,可以先反转原始数组,处理后再反转结果:

# 反转原始数组顺序
reversed_arr = arr[::-1]
# 重复上述排序、去重步骤
sorted_reversed = np.sort(reversed_arr, axis=1)
_, idx = np.unique(sorted_reversed, axis=0, return_index=True)
result_reversed = reversed_arr[idx][::-1]

print(result_reversed)
# 输出:[[2 0]
#        [3 0]
#        [4 1]
#        [3 2]]

内容的提问来源于stack exchange,提问作者Talleros

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 12:35:40