Scipy中的稀疏矩阵的编码方式
import numpy as np
from scipy import sparse
(1)COO( Coordinate)
最直观的就是COO格式。它用了1维的数组来表示2维的矩阵,每个数组的长度与稀疏矩阵A的非零数字个数一样,它们的组合(i,j)组成了非零数字在稀疏矩阵中的坐标。
row
,col
数组,组合起来指明非零数字在稀疏矩阵中的坐标/定位。data
数组,指定了非零数字是哪些
s=np.array([[4,0,3],
[0,32,0]]);s
array([[ 4, 0, 3],
[ 0, 32, 0]])
为表示 s
,我们这样做:
data=np.array([4,3,32])
row=np.array([0,0,1])
col=np.array([0,2,1])
s_coo=scipy.sparse.coo_matrix((data,(row,col)))
.toarray()
方法返回一个numpy数组来表示稀疏矩阵,我们用这个方法来检查下s_coo
是否创建对了:
s_coo.toarray()
array([[ 4, 0, 3],
[ 0, 32, 0]])
同样我们可以用.A
属性,但实际是调用了一个方法。但推荐用toarray()
。
(2)CSR 格式(Compressed Sparse Row)
COO格式虽然直观,但是不够精简,毕竟对于同一行/同一列的非零数字,我们重复的多用了row/column。因此,我们可以“压缩”行数,即只要表示出列数是从哪行到哪行就可以定位出非零数字的位置,而不用重复的写出来每一个非零数字的行数。这就是CSR的意思。
首先看一个COO的例子:
row=[0,1,1,1,1,2,3,4,4]
col=[2,0,1,3,4,1,0,3,4]
data=np.array([6,1,2,4,5,1,9,6,7])
ss=sparse.coo_matrix((data,(row,col)))
ss.toarray()
array([[0, 0, 6, 0, 0],
[1, 2, 0, 4, 5],
[0, 1, 0, 0, 0],
[9, 0, 0, 0, 0],
[0, 0, 0, 6, 7]])
现在用CRS
格式,row换成indptr,indptr=[0,1,5,6,7,9],即表示col[0,1)在第一行,即6在第一行第2列;col[1,5)在第二行,即1,2,4,5
在第二行的第0,1,3,4列,等等
indptr=[0,1,5,6,7,9]
csr=sparse.csr_matrix((data,col,indptr))
csr.toarray()
array([[0, 0, 6, 0, 0],
[1, 2, 0, 4, 5],
[0, 1, 0, 0, 0],
[9, 0, 0, 0, 0],
[0, 0, 0, 6, 7]])
(3)CSC(Compressed Sparse Column)
与CSR类似,但压缩的是列,data中的数字按列排列,不再赘述。
#####
愿你一寸一寸地攻城略地,一点一点地焕然一新
#####
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix