from scipy import sparse
在科學與工程領域中求解線性模型時常常出現許多大型的矩陣,這些矩陣中大部分的元素都爲0,被稱爲稀疏矩陣。用NumPy的ndarray數組保存這樣的矩陣,將很浪費內存,因爲矩陣的稀疏特性,能夠經過只保存非零元素的相關信息,從而節約內存的使用。此外,針對這種特殊結構的矩陣編寫運算函數,也能夠提升矩陣的運算速度。html
scipy.sparse庫中提供了多種表示稀疏矩陣的格式,每種格式都有不一樣的用處,其中dok_matrix和lil_matrix適合逐漸添加元素。數組
dok_matrix從dict繼承,它採用字典保存矩陣中不爲0的元素:字典的鍵是一個保存元素(行,列)信息的元組,其對應的值爲矩陣中位於(行,列)中的元素值。顯然字典格式的稀疏矩陣很適合單個元素的添加、刪除和存取操做。一般用來逐漸添加非零元素,而後轉換成其它支持快速運算的格式。函數
a = sparse.dok_matrix((10, 5)) a[2:5, 3] = 1.0, 2.0, 3.0 print a.keys() print a.values()
[(2, 3), (3, 3), (4, 3)] [1.0, 2.0, 3.0]
lil_matrix使用兩個列表保存非零元素。data保存每行中的非零元素,rows保存非零元素所在的列。這種格式也很適合逐個添加元素,而且能快速獲取行相關的數據。spa
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.0] [3.0, 2.0] [] [] [] [] [] []] [[] [] [3] [2, 4] [] [] [] [] [] []]
coo_matrix採用三個數組row、col和data保存非零元素的信息。這三個數組的長度相同,row保存元素的行,col保存元素的列,data保存元素的值。coo_matrix不支持元素的存取和增刪,一旦建立以後,除了將之轉換成其它格式的矩陣,幾乎沒法對其作任何操做和矩陣運算。htm
coo_matrix支持重複元素,即同一行列座標能夠出現屢次,當轉換爲其它格式的矩陣時,將對同一行列座標對應的多個值進行求和。在下面的例子中,(2, 3)對應兩個值:1和10,將其轉換爲ndarray數組時這兩個值加在一塊兒,因此最終矩陣中(2, 3)座標上的值爲11。繼承
許多稀疏矩陣的數據都是採用這種格式保存在文件中的,例如某個CSV文件中可能有這樣三列:「用戶ID,商品ID,評價值」。採用numpy.loadtxt或pandas.read_csv將數據讀入以後,能夠經過coo_matrix快速將其轉換成稀疏矩陣:矩陣的每行對應一位用戶,每列對應一件商品,而元素值爲用戶對商品的評價。ip
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()
[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軟件中數據的輸入格式三元組:內存
因此想到將本身的數據處理成相似的三元組!ci
即「matrix矩陣」—>"tuple三元組"—>"sparseMatrix2tuple"—>"scipy.sparse"get