如何剔除NumPy数组中重复元素的首次出现项?
处理NumPy数组:删除重复元素的首次出现,保留后续项
一维数组处理
针对一维数组(如示例[1,2,3,4,5,1,3,5,5]),可以通过统计元素出现次数、标记首次出现位置来筛选目标元素:
import numpy as np # 示例一维数组 arr = np.array([1,2,3,4,5,1,3,5,5]) # 标记每个元素的首次出现位置 _, first_indices = np.unique(arr, return_index=True) is_first_occurrence = np.zeros(arr.shape, dtype=bool) is_first_occurrence[first_indices] = True # 统计每个元素的出现次数 unique_vals, counts = np.unique(arr, return_counts=True) count_map = dict(zip(unique_vals, counts)) element_counts = np.array([count_map[val] for val in arr]) # 生成筛选掩码:保留「仅出现一次的元素」或「非首次出现的重复元素」 mask = (element_counts == 1) | (~is_first_occurrence) result = arr[mask] print(result) # 输出: [2 4 1 3 5 5]
二维数组处理
如果是二维数组(如示例[[14093, 'JRp1kX'], [140615, 'JRp1kX'], ...]),需先将每行转为可哈希的元组,再按相同逻辑处理:
import numpy as np # 示例二维数组(注意dtype=object以兼容不同类型元素) final = np.array([ [14093, 'JRp1kX'], [140615, 'JRp1kX'], [123, 'abc'], [456, 'def'], [123, 'abc'] ], dtype=object) # 将每行转换为元组,方便重复判断 row_tuples = [tuple(row) for row in final] # 标记每行的首次出现位置 _, first_indices = np.unique(row_tuples, return_index=True) is_first_row = np.zeros(final.shape[0], dtype=bool) is_first_row[first_indices] = True # 统计每行的出现次数 unique_rows, counts = np.unique(row_tuples, return_counts=True) count_map = dict(zip(unique_rows, counts)) row_counts = np.array([count_map[row] for row in row_tuples]) # 生成筛选掩码并获取结果 mask = (row_counts == 1) | (~is_first_row) result = final[mask] print(result) # 输出: # [[140615 'JRp1kX'] # [456 'def'] # [123 'abc']]
优化说明
如果处理超大型数组,避免使用列表推导式生成element_counts或row_counts,可改用向量化赋值提升效率:
# 一维数组的向量化统计方式 element_counts = np.zeros_like(arr) for val, cnt in zip(unique_vals, counts): element_counts[arr == val] = cnt
内容的提问来源于stack exchange,提问作者Anthony J. B.
相关产品推荐
相关产品推荐

