如何统计numpy数组中两列的出现频率?解决Counter报错问题
解决
collections.Counter统计numpy数组列组合时的TypeError: unhashable type: 'numpy.ndarray'问题 这个报错的核心原因很明确:numpy的ndarray对象是不可哈希的,而Counter要求它的键必须是可哈希类型(比如元组、字符串、整数这类不可变类型)。当你直接把df[:,[0,1]]的行传递给Counter时,每一行都是一个小的ndarray,自然会触发这个错误。下面给你几个实用的解决办法:
方法1:将数组行转换为元组(最直接的Pythonic方式)
通过生成器表达式把每一行的前两列数组转换成元组(元组是可哈希的),再传入Counter:
from collections import Counter import numpy as np # 假设df是你的numpy数组 pair_counts = Counter(tuple(row) for row in df[:, [0, 1]]) # 查看结果,比如打印出现次数最多的组合 print(pair_counts.most_common(5))
方法2:使用numpy自带的unique方法(大数据场景更高效)
如果你的数组数据量很大,numpy的向量化操作会比纯Python循环快很多。np.unique可以直接获取唯一的列组合和对应的计数:
import numpy as np # axis=0表示按行去重,return_counts=True返回每个唯一组合的出现次数 unique_pairs, counts = np.unique(df[:, [0, 1]], axis=0, return_counts=True) # 转换为字典方便查看(可选) pair_count_dict = {tuple(pair): cnt for pair, cnt in zip(unique_pairs, counts)}
方法3:用pandas实现类SQL的group by(可读性最高)
如果你能使用pandas库,写法会和你熟悉的SQL逻辑几乎一致,非常直观:
import pandas as pd # 将numpy数组的前两列转为DataFrame df_pd = pd.DataFrame(df[:, [0, 1]], columns=["col_0", "col_1"]) # 按两列分组并统计数量,转成字典(可选) grouped_counts = df_pd.groupby(["col_0", "col_1"]).size().to_dict()
你可以根据自己的数据规模和习惯选择合适的方法:小数据量用方法1足够简洁;大数据量优先考虑方法2的性能;如果熟悉pandas语法,方法3的可读性最好。
内容的提问来源于stack exchange,提问作者yanachen
相关产品推荐
相关产品推荐

