稀疏矩陣-sparsep
1
|
from scipy import sparse |
稀疏矩陣的儲存形式
在科學與工程領域中求解線性模型時經常出現許多大型的矩陣,這些矩陣中大部分的元素都為0,被稱為稀疏矩陣。用NumPy的ndarray數組保存這樣的矩陣,將很浪費內存,由于矩陣的稀疏特性,可以通過只保存非零元素的相關信息,從而節約內存的使用。此外,針對這種特殊結構的矩陣編寫運算函數,也可以提高矩陣的運算速度。
scipy.sparse庫中提供了多種表示稀疏矩陣的格式,每種格式都有不同的用處,其中dok_matrix和lil_matrix適合逐漸添加元素。
dok_matrix從dict繼承,它采用字典保存矩陣中不為0的元素:字典的鍵是一個保存元素(行,列)信息的元組,其對應的值為矩陣中位于(行,列)中的元素值。顯然字典格式的稀疏矩陣很適合單個元素的添加、刪除和存取操作。通常用來逐漸添加非零元素,然后轉換成其它支持快速運算的格式。
1
2
3
4
|
a = sparse.dok_matrix(( 10 , 5 )) a[ 2 : 5 , 3 ] = 1.0 , 2.0 , 3.0 print a.keys() print a.values() |
1
2
|
[( 2 , 3 ), ( 3 , 3 ), ( 4 , 3 )] [ 1.0 , 2.0 , 3.0 ] |
lil_matrix使用兩個列表保存非零元素。data保存每行中的非零元素,rows保存非零元素所在的列。這種格式也很適合逐個添加元素,并且能快速獲取行相關的數據。
1
2
3
4
5
6
|
b = sparse.lil_matrix(( 10 , 5 )) b[ 2 , 3 ] = 1.0 b[ 3 , 4 ] = 2.0 b[ 3 , 2 ] = 3.0 print b.data print b.rows |
1
2
|
[[] [] [ 1.0 ] [ 3.0 , 2.0 ] [] [] [] [] [] []] [[] [] [ 3 ] [ 2 , 4 ] [] [] [] [] [] []] |
coo_matrix采用三個數組row、col和data保存非零元素的信息。這三個數組的長度相同,row保存元素的行,col保存元素的列,data保存元素的值。coo_matrix不支持元素的存取和增刪,一旦創建之后,除了將之轉換成其它格式的矩陣,幾乎無法對其做任何操作和矩陣運算。
coo_matrix支持重復元素,即同一行列坐標可以出現多次,當轉換為其它格式的矩陣時,將對同一行列坐標對應的多個值進行求和。在下面的例子中,(2, 3)對應兩個值:1和10,將其轉換為ndarray數組時這兩個值加在一起,所以最終矩陣中(2, 3)坐標上的值為11。
許多稀疏矩陣的數據都是采用這種格式保存在文件中的,例如某個CSV文件中可能有這樣三列:“用戶ID,商品ID,評價值”。采用numpy.loadtxt或pandas.read_csv將數據讀入之后,可以通過coo_matrix快速將其轉換成稀疏矩陣:矩陣的每行對應一位用戶,每列對應一件商品,而元素值為用戶對商品的評價。
1
2
3
4
5
6
|
row = [ 2 , 3 , 3 , 2 ] col = [ 3 , 4 , 2 , 3 ] data = [ 1 , 2 , 3 , 10 ] c = sparse.coo_matrix((data, (row, col)), shape = ( 5 , 6 )) print c.col, c.row, c.data print c.toarray() |
1
2
3
4
5
6
|
[ 3 4 2 3 ] [ 2 3 3 2 ] [ 1 2 3 10 ] [[ 0 0 0 0 0 0 ] [ 0 0 0 0 0 0 ] [ 0 0 0 11 0 0 ] [ 0 0 3 0 2 0 ] [ 0 0 0 0 0 0 ]] |
個人操作中選擇,coo_matrix 選在因為涉及稀疏矩陣運算,但是如果不用其他形式存儲則復雜度太高(時間和空間)1000*1000的matrix大約話2h,也是要命了。無奈想到了Pajek軟件中數據的輸入格式三元組:
所以想到將自己的數據處理成類似的三元組!
即“matrix矩陣”—>"tuple三元組"—>"sparseMatrix2tuple"—>"scipy.sparse"
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
原文鏈接:https://my.oschina.net/u/1462678/blog/908403