如何快速删除numpy数组中包含任意全局重复值的行
实现方案
你描述的需求和给出的预期结果对应优先保留先出现的行、最终选中行的所有元素全局唯一的逻辑,以下是对应的实现方法:
步骤说明
- 维护一个已出现元素的集合,用于记录已经被保留行包含的元素
- 逐行遍历原数组,检查当前行所有元素是否都不在已出现集合中
- 符合条件的行保留,并将该行所有元素加入已出现集合,不符合条件的行直接过滤
代码实现
import numpy as np # 构造示例数组 A = np.array([[1, 4, 3], [1, 2, 5], [6, 7, 8], [9, 10, 2], [11, 3, 12]]) seen = set() keep_mask = [] for row in A: if all(val not in seen for val in row): keep_mask.append(True) seen.update(row) else: keep_mask.append(False) # 得到最终结果 result = A[keep_mask] print(result)
运行后输出和你给出的预期完全一致:
[[ 1 4 3] [ 6 7 8] [ 9 10 2]]
需求差异说明
如果你实际需求是删除所有包含全局出现过至少2次的元素的行,可以用下面的向量化实现,效率更高,但输出结果和你给出的预期不同:
# 统计全局所有元素的出现次数 vals, counts = np.unique(A, return_counts=True) # 筛选出所有重复的元素 dup_vals = vals[counts >= 2] # 只要行里有重复元素就过滤 keep_mask = ~np.isin(A, dup_vals).any(axis=1) result = A[keep_mask]
这个方法的输出为 [[6 7 8]]。
内容的提问来源于stack exchange,提问作者Feitan
相关产品推荐
相关产品推荐

