介紹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