Python數據分析----scipy稀疏矩陣


一、sparse模塊:

python中scipy模塊中,有一個模塊叫sparse模塊,就是專門為了解決稀疏矩陣而生。本文的大部分內容,其實就是基於sparse模塊而來的

導入模塊:from scipy import sparse

二、七種矩陣類型

  1. coo_matrix
  2. dok_matrix
  3. lil_matrix
  4. dia_matrix
  5. csr_matrix
  6. csc_matrix
  7. bsr_matrix

三、coo_matrix

coo_matrix是最簡單的存儲方式。采用三個數組row、col和data保存非零元素的信息。這三個數組的長度相同,row保存元素的行,col保存元素的列,data保存元素的值。一般來說,coo_matrix主要用來創建矩陣,因為coo_matrix無法對矩陣的元素進行增刪改等操作,一旦矩陣創建成功以后,會轉化為其他形式的矩陣。data = [5,2,3,0]

>>> row = [2,2,3,2]
>>> col = [3,4,2,3]
>>> c = sparse.coo_matrix((data,(row,col)),shape=(5,6))
>>> print c.toarray()
[[0 0 0 0 0 0]
 [0 0 0 0 0 0]
 [0 0 0 5 2 0]
 [0 0 3 0 0 0]
 [0 0 0 0 0 0]]
View Code

稍微需要注意的一點是,用coo_matrix創建矩陣的時候,相同的行列坐標可以出現多次。矩陣被真正創建完成以后,相應的坐標值會加起來得到最終的結果。

四、dok_matrix與lil_matrix

dok_matrix和lil_matrix適用的場景是逐漸添加矩陣的元素。

doc_matrix的策略是采用字典來記錄矩陣中不為0的元素。自然,字典的key存的是記錄元素的位置信息的元祖,value是記錄元素的具體值。

>>> import numpy as np
>>> from scipy.sparse import dok_matrix
>>> S = dok_matrix((5, 5), dtype=np.float32)
>>> for i in range(5):
...     for j in range(5):
...             S[i, j] = i + j
...
>>> print S.toarray()
[[ 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.]]
View Code

lil_matrix則是使用兩個列表存儲非0元素。data保存每行中的非零元素,rows保存非零元素所在的列。這種格式也很適合逐個添加元素,並且能快速獲取行相關的數據。

>>> from scipy.sparse import lil_matrix
>>> l = lil_matrix((6,5))
>>> l[2,3] = 1
>>> l[3,4] = 2
>>> l[3,2] = 3
>>> print l.toarray()
[[ 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.]]
>>> print l.data
[[] [] [1.0] [3.0, 2.0] [] []]
>>> print l.rows
[[] [] [3] [2, 4] [] []]
View Code

五、dia_matrix

這是一種對角線的存儲方式。其中,列代表對角線,行代表行。如果對角線上的元素全為0,則省略。
如果原始矩陣是個對角性很好的矩陣那壓縮率會非常高。
找了網絡上的一張圖,大家就很容易能看明白其中的原理。

六、csr_matrix與csc_matrix

csr_matrix,全名為Compressed Sparse Row,是按行對矩陣進行壓縮的。CSR需要三類數據:數值,列號,以及行偏移量。CSR是一種編碼的方式,其中,數值與列號的含義,與coo里是一致的。行偏移表示某一行的第一個元素在values里面的起始偏移位置。
同樣在網絡上找了一張圖,能比較好反映其中的原理。

以官方文檔為例,此時data代表的是存儲的值的數組,indices代表的是每一行中第幾列有對應data中的元素,即從indices中可以推斷出列的信息,
indptr則用來推斷出行的信息,默認元素開始為0,第一個元素為2,則證明第一行中有2-0=2個元素,所以將data數組中前另個元素寫入第一行中,而indices前兩個元素為0,2,則代表第0列和第2列。前兩第二個元素為3,證明第二行中有3-2=1個元素,該元素為data[2]=3,且存儲在indices[2] = 2列中。依次類推

>>> from scipy.sparse import csr_matrix
>>> 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])
>>> csr_matrix((data, indices, indptr), shape=(3, 3)).toarray()
array([[1, 0, 2],
       [0, 0, 3],
       [4, 5, 6]])
View Code

不難看出,csr_matrix比較適合用來做真正的矩陣運算。

至於csc_matrix,跟csr_matrix類似,只不過是基於列的方式壓縮的,不再單獨介紹。

七、bsr_matrix

按分塊的思想對矩陣進行壓縮。

 

摘自:https://blog.csdn.net/bitcarmanlee/article/details/52668477

 


免責聲明!

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



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