scipy.sparse的一些整理


一、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://blog.csdn.net/qq_33466771/article/details/80304498

https://blog.csdn.net/ChenglinBen/article/details/84424379

https://www.cnblogs.com/YangZnufe/p/8413374.html

https://blog.csdn.net/CY_TEC/article/details/106074237


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM