如何高效对含NumPy数组的列表按指定位置元素去重?
高效去重包含NumPy数组的列表:基于特定位置元素
需求:遍历包含NumPy数组的列表,移除那些在特定位置元素组合重复的数组。比如针对2×3数组组成的列表,要基于底行最后两个元素实现列表元素唯一。
原实现方法(效率极低,不适用于百万级数据):
import numpy as np my_array_list = [np.array([[1,2,3],[4,5,6]]), np.array([[9,8,7],[6,5,4]]), np.array([[2,3,4],[5,6,7]]), np.array([[1,7,8],[0,5,6]])] i = 0 # 原代码遗漏i的初始化,此处补充 while i < len(my_array_list): j = i + 1 while j < len(my_array_list): if my_array_list[i][1,1] == my_array_list[j][1,1] and my_array_list[i][1,2] == my_array_list[j][1,2]: del my_array_list[j] else: j += 1 i += 1 print(my_array_list) # 输出结果:保留前三个数组,最后一个因底行最后两元素(5,6)重复被删除
高效解决方案:单次遍历+集合记录特征
核心思路是用集合存储已出现的特征组合(集合查找为O(1)常数时间),只需遍历列表一次,彻底规避原方法的O(n²)时间复杂度和删除元素导致的列表移位开销。
代码实现:
import numpy as np my_array_list = [np.array([[1,2,3],[4,5,6]]), np.array([[9,8,7],[6,5,4]]), np.array([[2,3,4],[5,6,7]]), np.array([[1,7,8],[0,5,6]])] # 记录已出现的特征组合 seen_features = set() unique_arrays = [] for arr in my_array_list: # 提取底行最后两个元素,转成元组(NumPy元素不可直接哈希,元组可哈希) feature = tuple(arr[1, 1:3]) if feature not in seen_features: seen_features.add(feature) unique_arrays.append(arr) print(unique_arrays)
方案优势
- 时间复杂度降至O(n),仅需一次遍历,完美适配百万级规模的蒙特卡洛模拟数据
- 避免了原方法中
del操作导致的列表元素频繁移位(该操作时间复杂度为O(n),会大幅拖慢大列表处理速度) - 逻辑清晰,可快速扩展到其他位置的特征组合提取
内容的提问来源于stack exchange,提问作者SitoSanto
相关产品推荐
相关产品推荐

