如何高效统计Numpy大数组中子数组的出现频次?
更快的实现方式
针对大数据量的numpy数组统计子数组出现次数,有两种高效的替代方案,能避免Python循环带来的性能开销:
方法一:使用numpy原生的np.unique
利用numpy的向量化操作直接获取唯一子数组和对应计数,底层由C实现,速度远快于Python循环:
import numpy as np array = np.array([ [1,2],[1,2],[2,3], [1,2],[2,3],[5,2]]) # 指定axis=0按行去重,同时返回每个唯一行的出现次数 unique_arrays, counts = np.unique(array, axis=0, return_counts=True) # 转换为目标字典格式 result = {tuple(arr): cnt for arr, cnt in zip(unique_arrays, counts)} print(result)
方法二:使用collections.Counter
借助Python标准库的Counter工具,配合map批量转换子数组为元组,内部实现经过优化,比手动循环计数更高效:
import numpy as np from collections import Counter array = np.array([ [1,2],[1,2],[2,3], [1,2],[2,3],[5,2]]) # 直接统计转成元组后的子数组出现次数 result = Counter(map(tuple, array)) # 转换为普通字典(可选,Counter本身也支持字典操作) print(dict(result))
两种方法的输出结果均与原代码一致:{(1, 2): 3, (2, 3): 2, (5, 2): 1},在数组行数较多时,性能提升非常显著。
内容的提问来源于stack exchange,提问作者islam abdelmoumen
相关产品推荐
相关产品推荐

