首頁 >後端開發 >Python教學 >Python稀疏矩陣之sparse儲存與轉換的詳細介紹

Python稀疏矩陣之sparse儲存與轉換的詳細介紹

黄舟
黄舟原創
2017-05-28 10:56:307650瀏覽

這篇文章主要介紹了Python 稀疏矩陣-sparse 儲存和轉換的相關資料,需要的朋友可以參考下

##稀疏矩陣-sparsep#

from scipy import sparse

稀疏矩陣的儲存形式

在科學與工程領域中求解線性

模型時經常出現許多大型的矩陣,這些矩陣中大部分的元素都為0,稱為稀疏矩陣。用NumPy的ndarray數組保存這樣的矩陣,將很浪費內存,由於矩陣的稀疏特性,可以通過只保存非零元素的相關信息,從而節約內存的使用。此外,針對這種特殊結構的矩陣編寫運算函數,也可以提高矩陣的運算速度。

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保存非零元素所在的列。這種格式也很適合逐一加入元素,並且能快速取得行相關的資料。

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不支援元素的存取和增刪,一旦創建之後,除了將之轉換成其它格式的矩陣,幾乎無法對其做任何操作和矩陣運算。

coo_matrix支援重複元素,即相同行列座標可以出現多次,當轉換為其它格式的矩陣時,將對相同行列座標對應的多個值進行求和。在下面的例子中,(2, 3)對應兩個值:1和10,將其轉換為ndarray數組時這兩個值加在一起,所以最終矩陣中(2, 3)座標上的值為11 。

許多稀疏矩陣的資料都是採用這種格式保存在檔案中的,例如某個CSV檔案中可能有這樣三列:「使用者ID,商品ID,評價值」。採用numpy.loadtxt或pandas.read_csv將資料讀入之後,可以透過coo_matrix快速將其轉換成稀疏矩陣:矩陣的每行對應一位用戶,每列對應一件商品,而元素值為用戶對商品的評價。

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軟體中資料的輸入格式三元組:

所以想到將自己的資料處理成類似的三元組!

即「matrix矩陣」—>"tuple三元組"—>"sparseMatrix2tuple"—>"scipy.sparse"

以上是Python稀疏矩陣之sparse儲存與轉換的詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn