介绍html
BSR矩阵中的inptr列表的第i个元素与i+1个元素是储存第i行的数据的列索引以及数据的区间索引,即indices[indptr[i]:indptr[i+1]]为第i行元素的列索引,data[indptr[i]: indptr[i+1]]为第i行元素的data。python
在下面的例子中,对于第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行。数组
优势dom
和压缩稀疏行格式(CSR)很类似,可是BSR更适合于有密集子矩阵的稀疏矩阵,分块矩阵一般出如今向量值有限的离散元中,在这种情景下,比CSR和CSC算术操做更有效。ide
示例函数
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]] '''
介绍spa
坐标形式的一种稀疏矩阵。采用三个数组row、col和data保存非零元素的信息。这三个数组的长度相同,row保存元素的行,col保存元素的列,data保存元素的值。许多稀疏矩阵的数据都是采用这种格式保存在文件中的,例如某个CSV文件中可能有这样三列:“用户ID,商品ID,评价值”。采用numpy.loadtxt或pandas.read_csv将数据读入以后,能够经过coo_matrix快速将其转换成稀疏矩阵:矩阵的每行对应一位用户,每列对应一件商品,而元素值为用户对商品的评价。.net
便利快捷的在不一样稀疏格式间转换;容许重复录入,容许重复的元素;从CSR\CSC格式转换很是快速。code
不能直接进行科学计算和切片操做;不支持元素的存取和增删,一旦建立以后,除了将之转换成其它格式的矩阵,几乎没法对其作任何操做和矩阵运算。orm
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]] '''
介绍
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]] '''
介绍
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]] '''
介绍
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]] '''
介绍
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]] '''
介绍
基于行链接存储的稀疏矩阵。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官网。
下面的函数只针对csr_matrix列出,其余稀疏矩阵格式的函数也相似,具体能够查看对应稀疏矩阵的说明文档下面的函数说明部分。
内函数中有不少做用在矩阵元素的函数,下面列出一些函数。- arcsin():每一个元素进行arcsin运算
- floor():每一个元素进行floor运算
- sqrt():每一个元素进行sqrt运算
- maximum(other):比较稀疏矩阵与other矩阵的每一个元素,返回最大值
————————————————
参考文献:
https://blog.csdn.net/qq_33466771/article/details/80304498
https://blog.csdn.net/ChenglinBen/article/details/84424379