创建维基百科分类邻接矩阵时遇int32溢出错误求助
解决邻接矩阵生成时的int32溢出问题
出现这个错误的核心原因是:你的数据集里NuCat和NuSCat的唯一值数量太多,用pd.crosstab生成的密集矩阵维度过大,导致默认的int32类型无法容纳计数,同时巨量的内存占用也会触发溢出。下面是几个可行的解决办法:
- 改用稀疏矩阵存储(推荐)
分类与子分类的关联关系本身就是稀疏的,大部分位置都是0,没必要用密集DataFrame浪费内存。用scipy的稀疏矩阵只存储非零值,完全避开维度和类型溢出问题:
from scipy.sparse import csr_matrix import pandas as pd # 对分类ID做编码压缩,减少索引的内存占用 cat_codes = df['NuCat'].astype('category').cat.codes scat_codes = df['NuSCat'].astype('category').cat.codes # 构建CSR格式的稀疏邻接矩阵,每个关联位置标记为1 adj_matrix = csr_matrix(([1]*len(df), (cat_codes, scat_codes))) # 保留原始ID和编码的映射关系,方便后续查询 cat_id_map = df['NuCat'].astype('category').cat.categories scat_id_map = df['NuSCat'].astype('category').cat.categories
- 指定更高精度的数值类型
如果一定要用DataFrame形式的邻接矩阵(仅适用于唯一值数量不算极端的场景),可以强制指定dtype为int64,避免int32的溢出限制:
df_adj = pd.crosstab(df.NuCat, df.NuSCat, dtype='int64')
注意:如果唯一NuCat和NuSCat的数量都过万,这个方法会生成一个百万级维度的矩阵,内存占用会非常夸张,大概率会触发内存不足的问题。
- 按需筛选或聚合类别
如果不需要全量的邻接关系,可以先过滤掉低频的分类/子分类,缩小矩阵维度:
# 筛选出现次数超过10次的分类(阈值可以自己调整) cat_counts = df['NuCat'].value_counts() valid_cats = cat_counts[cat_counts > 10].index df_filtered = df[df['NuCat'].isin(valid_cats)] # 基于筛选后的数据集生成邻接矩阵 df_adj_filtered = pd.crosstab(df_filtered.NuCat, df_filtered.NuSCat, dtype='int64')
内容的提问来源于stack exchange,提问作者ouma
相关产品推荐
相关产品推荐

