最后更新于
最后更新于
scipy.sparse中提供了多种格式的稀疏矩阵, 每种都有自己的特点, 根据实际情况与需要选择使用. 因此要充分了解各种稀疏矩阵的特点.
Compressed Sparse Row matrix.
csr_matrix(D)
D表示dense matrix
csr_matrix(S)
S表示其他的稀疏矩阵, 相当于S.tocsr()
csr_matrix((M, N), [dtype])
创建一个shape为(M, N)的空的稀疏矩阵
csr_matrix((data, (row_ind, col_ind)), [shape=(M, N)])
data
, row_ind
, col_ind
对应着a[row_ind[k], col_ind[k]] = data[k]
如果不指定shape
, 则从传入的参数中自动推断
csr_matrix((data, indices, indptr), [shape=(M, N)])
这种形式就是CSR的标准形式
第i
行的有值的列索引存储在indices[indptr[i]:indptr[i+1]]
对应的值存储在data[indptr[i]:indptr[i+1]]
indptr相当于存储着每一行起始终止位置. 因此CSR这种形式是把所有的行数据存储在一个扁平列表中, 因此需要记录分隔位置.
数学计算效率高, 加乘等
行切片效率高
向量, 矩阵乘法效率高
列切片慢
转换成其他格式的稀疏矩阵慢(如LIL, DOK)
Compressed Sparse Column matrix.
csc_matrix(D)
D表示dense matrix
csc_matrix(S)
S表示其他的稀疏矩阵, 相当于S.tocsc()
csc_matrix((M, N), [dtype])
创建一个shape为(M, N)的空的稀疏矩阵
csc_matrix((data, (row_ind, col_ind)), [shape=(M, N)])
data
, row_ind
, col_ind
对应着a[row_ind[k], col_ind[k]] = data[k]
如果不指定shape
, 则从传入的参数中自动推断
csc_matrix((data, indices, indptr), [shape=(M, N)])
这种形式就是CSR的标准形式
第i
列的有值的行索引存储在indices[indptr[i]:indptr[i+1]]
对应的值存储在data[indptr[i]:indptr[i+1]]
indptr相当于存储着每一列起始终止位置. 因此CSR这种形式是把所有的列数据存储在一个扁平列表中, 因此需要记录分隔位置.
数学计算效率高, 加乘等
列切片效率高
向量, 矩阵乘法效率高
行切片慢
转换成其他格式的稀疏矩阵慢(如LIL, DOK)
A sparse matrix in COOrdinate format.
coo_matrix(D)
D表示dense matrix
coo_matrix(S)
S表示其他的稀疏矩阵, 相当于S.tocoo()
coo_matrix((data, (row_ind, col_ind)), [shape=(M, N)])
data
, row_ind
, col_ind
对应着a[row_ind[k], col_ind[k]] = data[k]
与各种形式的稀疏矩阵之间的转换高效, 特别是与csr/csc
之间相互的转换
输入时允许有重复位置的输入
不支持切片
不支持数学运算
COO是一种快速创建稀疏矩阵的格式, 新建稀疏矩阵很高效
一般是使用COO创建稀疏矩阵, 然后转为CSR或CSC格式进行矩阵的计算
转换成CSR或CSC格式时, 重复位置的元素会被加和
Row-based linked list sparse matrix
每行为一个array, 这个array的内容为排序好的非0位置的索引, 对应的data的array要与索引保持相同的格式且对齐.
这是用来增量添加来创建稀疏矩阵的格式. 注意在向已有的矩阵添加元素时, 要先排序, 然后再顺序添加.
这里的添加指的是使用切片指定添加.
lil_matrix(D)
D表示dense matrix
lil_matrix(S)
S表示其他的稀疏矩阵, 相当于S.tocoo()
lil_matrix((M, N), [dtype])
创建一个shape为(M, N)的空的稀疏矩阵
支持灵活的切片
转换成其他稀疏矩阵很高效
两个LIL类型的稀疏矩阵之间的加法很慢, 要先转换成CSR/CSC
格式
列切片很慢
矩阵乘积很慢
Dictionary Of Keys based sparse matrix.
这也是一种创建后增量增补数据的高效格式, 与LIL的区别在于保存数据的形式, LIL的是列表形式, DOK是字典的形式.
dok_matrix(D)
D表示dense matrix
dok_matrix(S)
S表示其他的稀疏矩阵, 相当于S.tocoo()
dok_matrix((M, N), [dtype])
创建一个shape为(M, N)的空的稀疏矩阵
由于是使用字典格式保存每个位置的值, 因此对单个值的查询和赋值都是在O(1)
内完成的, 非常高效.
Sparse matrix with DIAgonal storage.
dia_matrix(D)
D表示dense matrix
dia_matrix(S)
S表示其他的稀疏矩阵, 相当于S.tocoo()
dia_matrix((M, N), [dtype])
创建一个shape为(M, N)的空的稀疏矩阵
dia_matrix((data, offsets), shape=(M, N))
见例子