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

创建维基百科分类邻接矩阵时遇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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 10:05:30