为何Scipy CSR稀疏矩阵的indptr值与预期不符?
理解CSR稀疏矩阵的
indptr数组 你疑惑的核心是没搞清楚CSR(Compressed Sparse Row)矩阵中indptr数组的定义,咱们一步步拆解:
先明确indptr的作用
CSR矩阵的indptr数组是用来标记每一行在data和indices数组中的起始位置的,它的长度是行数 + 1。具体来说:
indptr[i]表示第i行的第一个元素在data/indices里的索引indptr[i+1] - indptr[i]就是第i行的非零元素个数
结合你的例子分析
看你切片后的矩阵m1,每一行都有2个非零元素:
- 第0行:(0,31)、(0,33) → 2个元素
- 第1行:(1,36)、(1,40) → 2个元素
- ...
- 第9行:(9,37)、(9,40) → 2个元素
那indptr的计算逻辑就是:
- 第0行起始索引:0
- 第1行起始索引:0 + 2 = 2(因为第0行占了前2个元素)
- 第2行起始索引:2 + 2 = 4(第1行又占了2个)
- ...
- 第10个位置(对应所有元素结束后的下一个索引):0 + 2*10 = 20
所以最终得到的indptr就是[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20],完全符合CSR的规范。
你的预期为什么不对?
你预期的[0,0,1,1,2,2,...]更像是COO(Coordinate)格式里的row数组——COO会给每个非零元素标记对应的行号,比如你的例子里COO的row数组就是[0,0,1,1,2,2,...,9,9]。但CSR是对行进行压缩存储的,indptr是把这种重复的行号转换成累积的起始位置,以此节省空间。
如果你的indptr真变成[0,0,1,1,...],那意味着:
- 第0行的元素个数是
0-0=0 - 第1行的元素个数是
1-0=1 - 这和你实际的矩阵结构完全不符,显然是错误的。
内容的提问来源于stack exchange,提问作者StatsSorceress
相关产品推荐
相关产品推荐

