官网链接:https://docs.scipy.org/doc/scipy/reference/sparse.html
常用的几种稀疏矩阵存储形式以及适用场景:
1. csr_matrix:
优点:1. 能进行高效的算术运算。如:csr+csr,csr*csr
2. 行切片很高效
3. 矩阵向量内积很快
缺点:1. 列切片很慢 (可以考虑csc)
2. 稀疏结构的改变很昂贵(可以考虑lil,dok)
2. csc_matrix:
优点:1. 同上能进行高效的算术运算
2. 有效的列切片
3. 很快的矩阵向量内积(csr,bsr更快)
缺点:1. 行切片慢(考虑csr)
2. 稀疏结构的改变很昂贵(考虑lil,dok)
3. coo_matrix:
优点:1. 转换成其它存储格式很快捷简便
2. 转换成csr/csc很快
3. 允许重复的索引(例如在1行1列处存了值2.0,又在1行1列处存了值3.0,则转换成其它矩阵时就是
2.0+3.0=5.0)
缺点:1. 不直接支持切片
2. 不能直接进行算术计算
coo_matrix构建稀疏矩阵非常快捷,实际中可以转换成csr/csc形式进行切片,算术计算与向量内积计算。
4. bsr_matrix:
很类似于csr,更适合于矩阵的某些子矩阵很多值,在某些情况下比csr和csc计算更高效。
5. dia_matrix:
对角线存储方式,0就在主对角线,-1在主对角线下方的第一条对角线。具体见官网例子。
6. dok_matrix:
优点:依靠键的字典构建矩阵,对于递增的构建稀疏矩阵很高效,比如定义该矩阵后,想进行每行每列更新值,可用该矩阵。当访问某个单
元,只需要O(1)
缺点:不允许重复索引(coo中适用),但可以很高效的转换成coo后进行重复索引
7. lil_matrix:
优点: 1. 支持灵活的切片
2. 转换成其它存储方式很高效
3. 适合递增的构建成矩阵
缺点:1. lil+lil等算术运算很慢(可以考虑csr,csc)
2. 列切片很慢(可以考虑csc)
3. 矩阵向量内积很慢(考虑csr,csc)
4. 当矩阵很大时,考虑用coo
注:
稀疏矩阵计算中注意事项:
1.matrix.multiply():
适合矩阵对应索引元素乘,即结果的每个元素sij=xij*yij,需区别它与点乘。
有两个好处:a.该方法适合广播,即矩阵乘以一个行向量可以广播到该矩阵的每一行。
b.该方法计算后对于计算后矩阵中元素为0的自动忽略。比如a矩阵的第0行0列为1,b矩阵的第0行0列为0,则乘了之 后第0行0列存储时不会有值。
c.如果是稀疏矩阵*稀疏矩阵,则为矩阵点乘,而密集矩阵*密集矩阵则是对应元素相乘
2.lil_matrix:
2.1 lil_matirx平时应用很广,例如,对一个很大的方阵的对角线循环shape[0]次赋值,lil_matrix远快于csc和csr,所以这种操作建议先转换为 lil_matrix
2.2 当进行一些矩阵运算的时候,原始为lil_matrix,之后可能会变成csr_matrix,所以注意检查慢的原因是不是变成了其它稀疏矩阵格式。
2.3 当保存稀疏矩阵时,lil_matrix不适合 原文:matrix: spmatrix (format: ``csc``, ``csr``, ``bsr``, ``dia`` or coo``)