如何高效移除Numpy数组中包含重复元素的行?
高效移除Numpy数组中含重复元素的行
针对Numpy数组,推荐用向量化操作替代逐行处理,这是提升速度的核心。以下两种方案都远快于pandas apply:
方案一:排序+差分检测(最优性能)
利用排序让重复元素相邻,再通过差分判断是否存在重复,全程无Python循环,适合大型数组:
import numpy as np arr = np.array([[1,2,3], [1,2,2], [2,2,2]]) # 对每行元素排序,重复元素会被集中到一起 sorted_rows = np.sort(arr, axis=1) # 计算每行相邻元素的差值,若差值为0则说明存在重复 has_dupe = np.any(np.diff(sorted_rows, axis=1) == 0, axis=1) # 筛选出无重复的行 filtered_arr = arr[~has_dupe] print(filtered_arr) # 输出: [[1 2 3]]
原理:np.diff和np.any都是Numpy底层优化的向量化函数,执行效率远高于Python层面的逐行遍历。
方案二:统计每行唯一元素数量(更直观)
通过对比每行唯一元素的数量和行长度,判断是否存在重复:
import numpy as np arr = np.array([[1,2,3], [1,2,2], [2,2,2]]) # 统计每行的唯一元素个数 unique_counts = np.array([len(np.unique(row)) for row in arr]) # 筛选唯一元素数等于行长度的行(无重复) filtered_arr = arr[unique_counts == arr.shape[1]] print(filtered_arr) # 输出: [[1 2 3]]
说明:这里虽然用了列表推导式,但np.unique本身是优化过的C实现,速度依然比pandas apply快很多,适合中小规模数组或追求代码可读性的场景。
性能提示
对于10万行以上的大型数组,方案一的速度会比方案二快2-5倍,因为完全避免了Python层面的循环,充分利用了Numpy的向量化计算优势。
内容的提问来源于stack exchange,提问作者Xe-
相关产品推荐
相关产品推荐

