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

如何直接从二元隐式数据创建csr_matrix,避免DataFrame溢出

直接从二元隐式数据创建SciPy稀疏矩阵(规避Pandas透视表内存溢出)

嘿,我完全懂你遇到的这个问题!37万多行的数据去做unstack确实容易爆内存——毕竟透视表会把所有可能的用户-物品对都展开成宽表,空间开销大到直接触发int32溢出。其实咱们完全可以跳过Pandas透视表这一步,直接从原始的UserId和ItemId数据生成SciPy的稀疏矩阵,效率高多了,还不会踩内存的坑。

核心思路

稀疏矩阵的本质是存储非零值的位置和对应数值,咱们不需要先把所有零值都生成出来(这就是透视表的问题所在),直接利用原始数据里的用户-物品对,转换成稀疏矩阵需要的行、列索引,再构造矩阵就行。

具体实现步骤

假设你已经从SQL把数据导入到了Pandas DataFrame(就叫df吧,包含UserId和ItemId两列),按下面的代码操作:

  1. 先导入依赖库
import pandas as pd
from scipy.sparse import csr_matrix
import numpy as np
  1. 对用户/物品ID做连续编码
    原始的UserId和ItemId可能是不连续的整数(甚至是字符串),而稀疏矩阵需要紧凑的连续整数索引来节省空间。用pd.factorize就能快速完成编码:
# 把原始UserId转换成从0开始的连续整数索引,同时保留原始ID与索引的映射
user_ids, unique_users = pd.factorize(df['UserId'])
# 对ItemId做同样的处理
item_ids, unique_items = pd.factorize(df['ItemId'])

这里unique_users和unique_items分别存储了原始的用户ID和物品ID,后续如果需要还原矩阵对应的真实ID,可以用它们来做映射。

  1. 构造稀疏矩阵
    如果你的数据里没有重复的用户-物品对(也就是每个用户对每个物品最多交互一次),直接用下面的代码生成矩阵:
# 所有非零值都是1(因为是隐式数据,存在交互记为1)
sparse_matrix = csr_matrix(
    (np.ones(len(df)), (user_ids, item_ids)),
    shape=(len(unique_users), len(unique_items))
)

如果数据里有重复的用户-物品对(比如同一个用户多次交互同一个物品,需要统计次数),就先统计每个对的出现次数,再构造矩阵:

# 统计每个(user_id, item_id)对的出现次数
_, idx, counts = np.unique(
    np.stack([user_ids, item_ids], axis=1),
    axis=0,
    return_index=True,
    return_counts=True
)

# 用统计后的counts作为非零值构造矩阵
sparse_matrix = csr_matrix(
    (counts, (user_ids[idx], item_ids[idx])),
    shape=(len(unique_users), len(unique_items))
)

为什么这个方法可行?

这个操作全程只处理原始的行数据,不会生成任何包含大量零值的宽表,内存占用只和非零交互的数量成正比——也就是你的37万多行数据的量级,完全不会触发之前的int32溢出问题。

内容的提问来源于stack exchange,提问作者Louis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:05:46