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

如何基于Pandas DataFrame高效构建Scipy稀疏矩阵?

如何用Pandas DataFrame和Scipy构建指定格式的稀疏方阵

我有一个Pandas DataFrame,每行格式如下:

i j d
----------
10 24 0.6

如何以i为行索引、j为列索引、d为值,基于scipy.sparse高效构建并填充稀疏矩阵?
该稀疏矩阵为方阵,行列数为已知值K,且i、j列中的所有数值均小于K。

这是稀疏矩阵构建里非常典型的场景,用Scipy的coo_matrix(坐标格式)来实现是最高效的方案,下面一步步来:

1. 提取DataFrame中的核心数据

首先把DataFrame里的行索引、列索引和对应值提取成NumPy数组——Scipy的稀疏矩阵构造函数对NumPy数组的兼容性最好,处理速度也最快:

import pandas as pd
from scipy.sparse import coo_matrix

# 假设你的DataFrame变量名为df
rows = df['i'].values
cols = df['j'].values
data = df['d'].values

2. 直接构建COO格式稀疏矩阵

调用coo_matrix的构造函数,传入数据、行列索引对,再指定方阵的形状(K, K)即可:

sparse_matrix = coo_matrix((data, (rows, cols)), shape=(K, K))

为什么优先选COO格式?

  • COO是专门为从坐标对构建稀疏矩阵设计的格式,构造过程几乎没有额外内存开销,速度极快
  • 如果后续需要做矩阵运算(比如行/列操作、矩阵乘法),可以轻松转换成更适合运算的格式,比如CSR或CSC:
    # 转换成CSR格式,适合行相关操作
    csr_matrix = sparse_matrix.tocsr()
    # 转换成CSC格式,适合列相关操作
    csc_matrix = sparse_matrix.tocsc()
    

几个需要注意的细节

  • 确认i和j是0-based索引:如果你的原始数据里的索引是1-based(比如从1开始),记得先做减1处理,比如rows = df['i'].values - 1
  • 处理重复坐标对:如果DataFrame里存在相同的(i,j)组合,COO会自动把对应的d值相加;如果需要自定义聚合逻辑,先对DataFrame做分组聚合,比如:
    # 对相同(i,j)的d值求和,再构建矩阵
    aggregated_df = df.groupby(['i', 'j'])['d'].sum().reset_index()
    rows = aggregated_df['i'].values
    cols = aggregated_df['j'].values
    data = aggregated_df['d'].values
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:10:27