scipy.sparse.csr_matrix与scipy.sparse.lil_matrix的区别及各自优势是什么?
scipy.sparse.csr_matrix 与 scipy.sparse.lil_matrix 的差异及优势 底层实现差异
lil_matrix(List of Lists Matrix,列表式稀疏矩阵):底层采用两个嵌套列表存储数据,一个列表按行存储每行非零元素的列索引,另一个列表按行存储对应非零元素的数值,每行的列表长度等于当前行的非零元素总数。csr_matrix(Compressed Sparse Row Matrix,压缩稀疏行矩阵):底层采用三个一维数组压缩存储:indptr:行指针数组,长度为「矩阵行数+1」,每个元素存储当前行非零元素在值数组中的起始偏移量indices:按行顺序排列的所有非零元素的列索引data:和indices一一对应的非零元素数值
各自优势与适用场景
lil_matrix 优势
- 极适合动态构建稀疏矩阵的场景:如果预先不知道非零元素的分布,需要逐个插入、修改非零元素时,
lil_matrix的单元素操作时间复杂度极低,效率远高于csr_matrix。 - 行切片操作效率高,读取/修改指定行的非零元素非常方便。
- 缺点:内存占用比压缩格式高,矩阵乘法、向量运算等数值操作效率极低,不适合做线性代数计算。
csr_matrix 优势
- 极适合数值运算的场景:作为压缩存储格式,内存占用远低于
lil_matrix,矩阵乘法、向量乘法、求和、转置等线性代数运算的速度是所有稀疏矩阵格式中第一梯队的水平,是工业界做稀疏计算的首选格式。 - 全量非零元素遍历、行遍历的效率非常高,适合批量处理矩阵数据。
- 缺点:不支持高效的动态元素修改,插入/删除单个非零元素的开销极大,不适合增量构建矩阵。
通用最佳实践:需要从零构建稀疏矩阵时,先用
lil_matrix完成所有非零元素的写入,再调用.tocsr()方法一次性转换为csr_matrix做后续运算,同时兼顾构建效率和计算效率。
内容的提问来源于stack exchange,提问作者최재원
相关产品推荐
相关产品推荐

