You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何统计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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:34:41