http://blog.csdn.net/nkwangjie/article/details/17502443
http://blog.csdn.net/bitcarmanlee/article/details/52668477
稀疏矩陣有很多種,這里總結2種:
from scipy import sparse
1、csr_matrix 【行壓縮矩陣) (與之對應,列壓縮舉證:csc_matrix】
csr_matrix,全名為Compressed Sparse Row,是按行對矩陣進行壓縮的。CSR需要三類數據:數值,列號,以及行偏移量。
CSR是一種編碼的方式,其中,數值與列號的含義,與coo里是一致的。
行偏移表示某一行的第一個元素在values里面的起始偏移位置。
同樣在網絡上找了一張圖,能比較好反映其中的原理。
CSR是比較標准的一種,也需要三類數據來表達:數值,列號,以及行偏移。CSR不是三元組,而是整體的編碼方式。
數值和列號與COO一致,表示一個元素以及其列號,行偏移表示某一行的第一個元素在values里面的起始偏移位置。
如下圖中,第一行元素1是0偏移,第二行元素2是2偏移,第三行元素5是4偏移,第4行元素6是7偏移。在行偏移的最后補上矩陣總的元素個數,本例中是9。
【備注】 列索引表示數值所在的列號,從0開始。值表示該數值。沒有行索引,行索引被壓縮,而在COO中,行索引沒被壓縮。這里用行偏移表示行索引,
其實就是把值作為一個列表后,指出值這個列表中哪個值是某一行的第一個元素。比如,下圖有4行,那么行索引有4個,0,2,4,7 分別表示,在值得列表中,第
0個,第2個,第4個,第7個分別為第1,2,3,4行的第一個元素,即值列表中的1,2,5,6。這樣有幾行數據,就只需要幾個行偏移值了。
最后一個9,表示非零元素一共有9個。

看看在python里怎么使用:
>>> 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]])
2.coo_matrix
coo_matrix是最簡單的存儲方式。采用三個數組row、col和data保存非零元素的信息。這三個數組的長度相同,row保存元素的行,col保存元素的列,data保存元素的值。
一般來說,coo_matrix主要用來創建矩陣,因為coo_matrix無法對矩陣的元素進行增刪改等操作,一旦矩陣創建成功以后,會轉化為其他形式的矩陣。
>>> 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]]
