一, scipy.sparse 中七种稀疏矩阵类型
1,bsr_matrix: 分块压缩稀疏行格式
介绍
BSR 矩阵中的 inptr 列表的第 i 个元素与 i+1 个元素是储存第 i 行的数据的列索引以及数据的区间索引, 即 indices[indptr[i]:indptr[i+1]]为第 i 行元素的列索引, data[indptr[i]: indptr[i+1]]为第 i 行元素的 data.
在下面的例子中, 对于第 0 行, indptr[0]:indptr[1] -> 0:2, 因此第 0 行的列为 indice[0:2]=[0,2],data 为 data[0:2]=array([[[1, 1],[1, 1]],[[2, 2],[2, 2]]]), 对应的就是最后结果的第 0,1 行.
优点
和压缩稀疏行格式 (CSR) 很相似, 但是 BSR 更适合于有密集子矩阵的稀疏矩阵, 分块矩阵通常出现在向量值有限的离散元中, 在这种情景下, 比 CSR 和 CSC 算术操作更有效.
示例
- indptr = np.array([0, 2, 3, 6])
- indices = np.array([0, 2, 2, 0, 1, 2])
- data = np.array([1, 2, 3, 4, 5, 6]).repeat(4).reshape(6, 2, 2)
- bsr_mat=bsr_matrix((data,indices,indptr), shape=(6, 6)).toarray()
输出:
'''
[[1 1 0 0 2 2]
[1 1 0 0 2 2]
[0 0 0 0 3 3]
[0 0 0 0 3 3]
[4 4 5 5 6 6]
[4 4 5 5 6 6]]
'''
2,coo_matrix 是可以根据行和列索引进行 data 值的累加
介绍
坐标形式的一种稀疏矩阵. 采用三个数组 row,col 和 data 保存非零元素的信息. 这三个数组的长度相同, row 保存元素的行, col 保存元素的列, data 保存元素的值. 许多稀疏矩阵的数据都是采用这种格式保存在文件中的, 例如某个 CSV 文件中可能有这样三列:"用户 ID, 商品 ID, 评价值". 采用 numpy.loadtxt 或 pandas.read_csv 将数据读入之后, 可以通过 coo_matrix 快速将其转换成稀疏矩阵: 矩阵的每行对应一位用户, 每列对应一件商品, 而元素值为用户对商品的评价.
优点
便利快捷的在不同稀疏格式间转换; 允许重复录入, 允许重复的元素; 从 CSR\CSC 格式转换非常快速.
缺点
不能直接进行科学计算和切片操作; 不支持元素的存取和增删, 一旦创建之后, 除了将之转换成其它格式的矩阵, 几乎无法对其做任何操作和矩阵运算.
- row = np.array([0, 0, 1, 3, 1, 0, 0])
- col = np.array([0, 2, 1, 3, 1, 0, 0])
- data = np.array([1, 1, 1, 1, 1, 1, 1])
- coo_mat=coo_matrix((data, (row, col)), shape=(4, 4)).toarray()
输出:
- '''
- [[3 0 1 0]
- [0 2 0 0]
- [0 0 0 0]
- [0 0 0 1]]
- '''
- 3,csc_matrix
介绍
csc_matrix 的初始化方法可以是 bsr_matrix 的初始化方法, 也可以是 coo_matrix 的初始化方法
优缺点:
高效的 CSC +CSC, CSC * CSC 算术运算; 高效的列切片操作. 但是矩阵内积操作没有 CSR, BSR 快; 行切片操作慢(相比 CSR); 稀疏结构的变化代价高(相比 LIL 或者 DOK).
- row = np.array([0, 0, 1, 3, 1, 0, 0])
- col = np.array([0, 2, 1, 3, 1, 0, 0])
- data = np.array([1, 1, 1, 1, 1, 1, 1])
- csc_mat=csc_matrix((data, (row, col)), shape=(4, 4)).toarray()
输出:
- '''
- [[3 0 1 0]
- [0 2 0 0]
- [0 0 0 0]
- [0 0 0 1]]
- '''
- 4,csr_matrix
介绍
csr_matrix 的初始化与 csc_matrix 一致.
优缺点
高效的 CSR + CSR, CSR *CSR 算术运算; 高效的行切片操作; 高效的矩阵内积内积操作. 但是列切片操作慢 (相比 CSC); 稀疏结构的变化代价高(相比 LIL 或者 DOK).CSR 格式在存储稀疏矩阵时非零元素平均使用的字节数(Bytes per Nonzero Entry) 最为稳定(float 类型约为 8.5,double 类型约为 12.5).CSR 格式常用于读入数据后进行稀疏矩阵计算.
- row = np.array([0, 0, 1, 3, 1, 0, 0])
- col = np.array([0, 2, 1, 3, 1, 0, 0])
- data = np.array([1, 1, 1, 1, 1, 1, 1])
- csr_mat=csr_matrix((data, (row, col)), shape=(4, 4)).toarray()
输出:
- '''
- [[3 0 1 0]
- [0 2 0 0]
- [0 0 0 0]
- [0 0 0 1]]
- '''
- 5,dia_matrix
介绍
data 定义对角线元素, 在这里是[1,2,3,4].
offsets 定义对角线的偏移量, 0 代表正对角线, 正数代表往上偏移, 负数代表往下偏移.
优缺点
对角存储格式 (DIA) 和 ELL 格式在进行稀疏矩阵 - 矢量乘积 (sparse matrix-vector products) 时效率最高, 所以它们是应用迭代法 (如共轭梯度法) 解稀疏线性系统最快的格式; DIA 格式存储数据的非零元素平均使用的字节数与矩阵类型有较大关系, 适合于 StructuredMesh 结构的稀疏矩阵(float 类型约为 4.05,double 类型约为 8.10). 对于 Unstructured Mesh 以及 Random Matrix,DIA 格式使用的字节数是 CSR 格式的十几倍.
- data = np.array([[1, 2, 3, 4]]).repeat(3, axis=0)
- offsets = np.array([0, -1, 2])
- dia_mat=dia_matrix((data, offsets), shape=(4, 4)).toarray()
输出:
- '''
- [[1 0 3 0]
- [1 2 0 4]
- [0 2 3 0]
- [0 0 3 4]]
- '''
- 6,dok_matrix
介绍
dok_matrix 从 dict 继承, 它采用字典保存矩阵中不为 0 的元素: 字典的键是一个保存元素 (行, 列) 信息的元组, 其对应的值为矩阵中位于 (行, 列) 中的元素值.
优缺点
显然字典格式的稀疏矩阵很适合单个元素的添加, 删除和存取操作. 通常用来逐渐添加非零元素, 然后转换成其它支持快速运算的格式.
- S = dok_matrix((5, 5), dtype=np.int)
- for i in range(5):
- for j in range(5):
- S[i, j] = i + j
输出:
- '''
- [[0 1 2 3 4]
- [1 2 3 4 5]
- [2 3 4 5 6]
- [3 4 5 6 7]
- [4 5 6 7 8]]
- '''
- 7,lil_matrix
介绍
基于行连接存储的稀疏矩阵. lil_matrix 使用两个列表保存非零元素. data 保存每行中的非零元素, rows 保存非零元素所在的列.
优缺点
这种格式也很适合逐个添加元素, 并且能快速获取行相关的数据.
- l = lil_matrix((6,5))
- l[2,3] = 1
- l[3,4] = 2
- l[3,2] = 3
- print (l.toarray())
- print(l.data)
- print(l.rows)
输出
'''
[[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 1. 0.]
[0. 0. 3. 0. 2.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]]
- [list([]) list([]) list([1.0]) list([3.0, 2.0]) list([]) list([])]
- [list([]) list([]) list([3]) list([2, 4]) list([]) list([])]
二, scipy.sparse 中的矩阵函数
下面我只列出比较有用的函数, 其他的函数可以参见 scipy.sparse 官网.
构造函数
eye(m[, n, k, dtype, format]): 对角线为 1 的稀疏矩阵
identity(n[, dtype, format]): 单位矩阵
diags(diagonals[, offsets, shape, format, dtype]): 构造对角矩阵(含偏移量)
spdiags(data, diags, m, n[, format]): 从矩阵中返回含偏移量的对角稀疏矩阵
hstack(blocks[, format, dtype]) Stack sparse matrices horizontally (column wise) : 在竖直方向上堆叠
vstack(blocks[, format, dtype]) Stack sparse matrices vertically (row wise): 在水平方向上平铺
判别函数
issparse(x):x 是否为 sparse 类型
isspmatrix(x):x 是否为 sparse 类型
isspmatrix_csc(x):x 是否为 csc_matrix 类型
isspmatrix_csr(x):x 是否为 csr_matrix 类型
isspmatrix_bsr(x):x 是否为 bsr_matrix 类型
isspmatrix_lil(x):x 是否为 lil_matrix 类型
isspmatrix_dok(x):x 是否为 dok_matrix 类型
isspmatrix_coo(x):x 是否为 coo_matrix 类型
isspmatrix_dia(x):x 是否为 dia_matrix 类型
其他有用函数
save_npz(file, matrix[, compressed]): 以. npz 格式保存稀疏矩阵
load_npz(file): 导入. npz 格式的稀疏矩阵
find(A): 返回稀疏矩阵 A 中的非零元的位置以及数值
scipy.sparse 中的作用在矩阵的内函数
下面的函数只针对 csr_matrix 列出, 其他稀疏矩阵格式的函数也类似, 具体可以查看对应稀疏矩阵的说明文档下面的函数说明部分.
针对元素的函数
内函数中有很多作用在矩阵元素的函数, 下面列出一些函数.- arcsin(): 每个元素进行 arcsin 运算
- floor(): 每个元素进行 floor 运算
- sqrt(): 每个元素进行 sqrt 运算
- maximum(other): 比较稀疏矩阵与 other 矩阵的每个元素, 返回最大值
转化函数
todense([order, out]): 返回稀疏矩阵的 np.matrix 形式
toarray([order, out]): 返回稀疏矩阵的 np.array 形式
tobsr([blocksize, copy]): 返回稀疏矩阵的 bsr_matrix 形式
tocoo([copy]): 返回稀疏矩阵的 coo_matrix 形式
tocsc([copy]): 返回稀疏矩阵的 csc_matrix 形式
tocsr([copy]): 返回稀疏矩阵的 csr_matrix 形式
todia([copy]): 返回稀疏矩阵的 dia_matrix 形式
todok([copy]): 返回稀疏矩阵的 dok_matrix 形式
tolil([copy]): 返回稀疏矩阵的 lil_matrix 形式
其他函数
get_shape(): 返回稀疏矩阵的维度 max([axis, out]): 返回稀疏矩阵沿着某个轴的最大值
reshape(self, shape[, order, copy]): 将稀疏矩阵的维度重构
diagonal([k]): 返回第 k 个对角元素, 但是在我的 python3 版本中 k 不起作用.
dot(other): 与 other 矩阵的矩阵乘法
----------------
参考文献:
https://www.cnblogs.com/YangZnufe/p/8413374.html
来源: https://www.cnblogs.com/SupremeBoy/p/12952735.html