Python稀疏矩阵存储格式详解:dok、lil与coo矩阵的应用与转换

慢慢来
慢慢来
发布时间:2026-10-13 | 4人浏览过
原创

本文深入解析Python中scipy.sparse库提供的多种稀疏矩阵存储格式,重点对比dok_matrix、lil_matrix和coo_matrix的特性与适用场景。文章详细说明了如何根据数据构建需求选择合适格式,并演示了利用coo_matrix处理重复元素及从CSV文件快速构建稀疏矩阵的方法,旨在帮助开发者优化内存使用并提升大规模线性模型运算效率。

稀疏矩阵-sparsep

from scipy import sparse

稀疏矩阵的储存形式

在科学与工程计算领域,求解线性模型时经常遇到大型矩阵,其中绝大多数元素为零,这类矩阵被称为稀疏矩阵。若使用NumPy的ndarray数组直接存储此类矩阵,会造成巨大的内存浪费。鉴于矩阵的稀疏特性,我们可以仅保存非零元素的相关信息,从而显著节省内存空间。此外,针对这种特殊数据结构编写专用的运算函数,还能有效提高矩阵计算的执行速度。

scipy.sparse库提供了多种表示稀疏矩阵的格式,每种格式各有其特定的用途。其中,dok_matrix和lil_matrix这两种格式特别适合用于逐步添加元素的操作场景。

dok_matrix类从Python字典继承而来,它采用字典结构来存储矩阵中非零元素:字典的键是一个包含(行,列)坐标信息的元组,而对应的值则是该坐标位置上的元素数值。显然,这种字典格式的稀疏矩阵非常适合进行单个元素的添加、删除和存取操作。它通常被用于逐步添加非零元素,待数据构建完成后,再转换为其他支持快速运算的矩阵格式。

a = sparse.dok_matrix((10, 5))
a[2:5, 3] = 1.0, 2.0, 3.0
print a.keys()
print a.values()
[(2, 3), (3, 3), (4, 3)]
[1.0, 2.0, 3.0]

lil_matrix使用两个列表来保存非零元素。其中,data列表存储每一行中的非零元素值,rows列表则记录这些非零元素所在的列索引。这种格式同样非常适合逐个添加元素,并且能够快速获取与特定行相关的数据信息。

b = sparse.lil_matrix((10, 5))
b[2, 3] = 1.0
b[3, 4] = 2.0
b[3, 2] = 3.0
print b.data
print b.rows
[[] [] [1.0] [3.0, 2.0] [] [] [] [] [] []]
[[] [] [3] [2, 4] [] [] [] [] [] []]

coo_matrix采用三个独立的数组:row、col和data来保存非零元素的信息。这三个数组的长度保持一致,row数组保存元素的行索引,col数组保存元素的列索引,data数组保存对应的元素值。需要注意的是,coo_matrix不支持对元素的直接存取或增删操作。一旦创建完成,除了将其转换为其他格式的矩阵外,几乎无法对其执行任何修改或矩阵运算。

coo_matrix支持重复元素,即同一行列坐标可以在输入数据中出现多次。当转换为其他格式的矩阵时,系统会对同一行列坐标对应的多个值进行求和。在下面的示例中,坐标(2, 3)对应两个值:1和10。当将其转换为ndarray数组时,这两个值相加,因此最终矩阵中(2, 3)坐标处的值为11。

许多稀疏矩阵的数据采用这种格式保存在文件中,例如某个CSV文件可能包含“用户ID,商品ID,评价值”三列数据。使用numpy.loadtxt或pandas.read_csv将数据读取后,可以通过coo_matrix快速将其转换为稀疏矩阵:矩阵的每一行对应一位用户,每一列对应一件商品,而元素值则代表用户对商品的评价分数。

row = [2, 3, 3, 2]
col = [3, 4, 2, 3]
data = [1, 2, 3, 10]
c = sparse.coo_matrix((data, (row, col)), shape=(5, 6))
print c.col, c.row, c.data
print c.toarray()
[3 4 2 3] [2 3 3 2] [ 1 2 3 10]
[[ 0 0 0 0 0 0]
 [ 0 0 0 0 0 0]
 [ 0 0 0 11 0 0]
 [ 0 0 3 0 2 0]
 [ 0 0 0 0 0 0]]

在实际操作中,选择coo_matrix是因为涉及稀疏矩阵运算时,若不使用其他高效存储形式,计算复杂度(时间和空间)会过高。例如,处理一个1000*1000的矩阵大约需要2小时,这显然是不可接受的。因此,借鉴Pajek软件中数据的输入格式三元组:

基于上述考虑,我们将数据处理成类似的三元组格式。

具体流程为:“matrix矩阵”—>"tuple三元组"—>"sparseMatrix2tuple"—>"scipy.sparse"

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表