【嵌牛导读】 本文主要围绕python模块scipy中的稀疏矩阵展开
【嵌牛鼻子】scipy 稀疏矩阵
【嵌牛提问】python模块scipy中的稀疏矩阵是如何存储的呢?
【嵌牛正文】
参考文章:https://www.cnblogs.com/zhangchaoyang/articles/5483453.html
一:dok_matrix
继承自dict,key是(row,col)构成的二元组,value是非0元素。
优点:
1.非常高效地添加、删除、查找元素
2.转换成coo_matrix很快
缺点:
1.继承了dict的缺点,即内存开销大
2.不能有重复的(row,col)
二:coo_matrix
如上图,构造coo_matrix需要3个等长的数组,values数组存放矩阵中的非0元素,row indices存放非0元素的行坐标,column indices存放非0元素的列坐标。
优点:
1.容易构造
2.可以快速地转换成其他形式的稀疏矩阵
3.支持相同的(row,col)坐标上存放多个值
缺点:
1.构建完成后不允许再插入或删除元素
2.不能直接进行科学计算和切片操作
三:csr_matrix
csr_matrix同样由3个数组组成,values存储非0元素,column indices存储非0元素的列坐标,row offsets依次存储每行的首元素在values中的坐标,如果某行全是0则对应的row offsets值为-1。
优点:
1.高效地按行切片
2.快速地计算矩阵与向量的内积
3.高效地进行矩阵的算术运行,CSR + CSR、CSR * CSR等
缺点:
1.按列切片很慢(考虑CSC)
2.一旦构建完成后,再往里面添加或删除元素成本很高
四:dia_matrix
对角线存储法,按对角线方式存,列代表对角线,行代表行。省略全零的对角线。(从左下往右上开始:第一个对角线是零忽略,第二个对角线是5,6,第三个对角线是零忽略,第四个对角线是1,2,3,4,第五个对角线是7,8,9,第六第七个对角线忽略)。
这里行对应行,所以5和6是分别在第三行第四行的,前面补上无效元素*。如果对角线中间有0,存的时候也需要补0。
适用场景:
如果原始矩阵就是一个对角性很好的矩阵那压缩率会非常高,比如下图,但是如果是随机的那效率会非常糟糕。