如何无需多层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
相关产品推荐
相关产品推荐

