Python 稀疏矩陣 sparse 儲存和轉換

2022-10-04 11:48:16 字數 2032 閱讀 1097

稀疏矩陣-sparsep

from scip程式設計客棧y 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, 2uuytujmjko] = 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"—>uuytujmjko"scipy.sparse"

本文標題: python 稀疏矩陣-sparse 儲存和轉換

本文位址:

python稀疏矩陣

1.為什麼使用稀疏矩陣 稀疏矩陣的兩個動機 稀疏矩陣通常具有很大的維度,有時甚大到整個矩陣 零元素 與可用記憶體不想適應 另乙個動機是避免零矩陣元素的運算具有更好的效能。2.稀疏列矩陣csc compressed sparse column python中是使用csc matrix按列對矩陣進行壓縮...

python 生成隨機稀疏矩陣

import numpy as np import scipy.sparse as ss 生成隨機稀疏矩陣 num col 20num row 10num ele 40a np.random.randint 0,num row for in range num ele b np.random.ran...

稀疏矩陣相乘 Python版

given two sparse matricesaandb,return the result ofab.you may assume thata s column number is equal tob s row number.example a 1,0,0 1,0,3 b 7,0,0 0,0...