numpy稀疏矩陣的實(shí)現(xiàn)
1. coo存儲(chǔ)方式
采用三元組(row, col, data)(或稱為ijv format)的形式來存儲(chǔ)矩陣中非零元素的信息。
coo_matrix的優(yōu)點(diǎn):有利于稀疏格式之間的快速轉(zhuǎn)換(tobsr()、tocsr()、to_csc()、to_dia()、to_dok()、to_lil();允許重復(fù)項(xiàng)(格式轉(zhuǎn)換的時(shí)候自動(dòng)相加);能與CSR / CSC格式的快速轉(zhuǎn)換
coo_matrix的缺點(diǎn):不能直接進(jìn)行算術(shù)運(yùn)算,包括賦值

初始化方式:
coo_matrix(D), D代表密集矩陣
賦值:
>>> import numpy as np
>>> from scipy.sparse import coo_matrix
>>> _row = np.array([0, 3, 1, 0])
>>> _col = np.array([0, 3, 1, 2])
>>> _data = np.array([4, 5, 7, 9])
>>> coo = coo_matrix((_data, (_row, _col)), shape=(4, 4), dtype=np.int)
>>> coo.todense() # 通過toarray方法轉(zhuǎn)化成密集矩陣(numpy.matrix)
>>> coo.toarray() # 通過toarray方法轉(zhuǎn)化成密集矩陣(numpy.ndarray)
array([[4, 0, 9, 0],
[0, 7, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 5]])
2. dok_matrix
? dok_matrix,即Dictionary Of Keys based sparse matrix,是一種類似于coo matrix但又基于字典的稀疏矩陣存儲(chǔ)方式,key由非零元素的的坐標(biāo)值tuple(row, column)組成,value則代表數(shù)據(jù)值。dok matrix非常適合于增量構(gòu)建稀疏矩陣,并一旦構(gòu)建,就可以快速地轉(zhuǎn)換為coo_matrix。
>>> import numpy as np
>>> from scipy.sparse import dok_matrix
>>> np.random.seed(10)
>>> matrix = random(3, 3, format='dok', density=0.4)
>>> matrix[1, 1] = 33
>>> matrix[2, 1] = 10
>>> matrix.toarray()
array([[ 0. , 0. , 0. ],
[ 0. , 33. , 0. ],
[ 0.19806286, 10. , 0.22479665]])
>>> dict(matrix)
{(2, 0): 0.19806286475962398, (2, 1): 10.0, (2, 2): 0.22479664553084766, (1, 1): 33.0}
>>> isinstance(matrix, dict)
True
3. csr和csc存儲(chǔ)方式
csr_matrix,全稱Compressed Sparse Row matrix,即按行壓縮的稀疏矩陣存儲(chǔ)方式,由三個(gè)一維數(shù)組indptr, indices, data組成。這種格式要求矩陣元「按行順序存儲(chǔ)」,「每一行中的元素可以亂序存儲(chǔ)」。那么對(duì)于每一行就只需要用一個(gè)指針表示該行元素的起始位置即可。indptr存儲(chǔ)每一行數(shù)據(jù)元素的起始位置,indices這是存儲(chǔ)每行中數(shù)據(jù)的列號(hào),與data中的元素一一對(duì)應(yīng)。
csr_matrix,是按列壓縮,不再贅述

csr_matrix的優(yōu)點(diǎn):
高效的算術(shù)運(yùn)算CSR + CSR,CSR * CSR等
高效的行切片
快速矩陣運(yùn)算
csr_matrix的缺點(diǎn):
列切片操作比較慢(考慮csc_matrix)
稀疏結(jié)構(gòu)的轉(zhuǎn)換比較慢(考慮lil_matrix或doc_matrix)
>>> import numpy as np
>>> 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 = csr_matrix((data, indices, indptr), shape=(3, 3)).toarray()
array([[1, 0, 2],
[0, 0, 3],
[4, 5, 6]])
4. lil_matrix
lil_matrix,即List of Lists format,又稱為Row-based linked list sparse matrix。它使用兩個(gè)嵌套列表存儲(chǔ)稀疏矩陣:data保存每行中的非零元素的值,rows保存每行非零元素所在的列號(hào)(列號(hào)是順序排序的)。
LIL matrix本身的設(shè)計(jì)是用來方便快捷構(gòu)建稀疏矩陣實(shí)例,而算術(shù)運(yùn)算、矩陣運(yùn)算則轉(zhuǎn)化成CSC、CSR格式再進(jìn)行,構(gòu)建大型的稀疏矩陣還是推薦使用COO格式。

5. dia_matrix
? dia_matrix,全稱Sparse matrix with DIAgonal storage,是一種對(duì)角線的存儲(chǔ)方式。如下圖中,將稀疏矩陣使用offsets和data兩個(gè)矩陣來表示。

>>> data = np.arange(15).reshape(3, -1) + 1
>>> offsets = np.array([0, -3, 2])
>>> dia = sparse.dia_matrix((data, offsets), shape=(7, 5))
>>> dia.toarray()
array([[ 1, 0, 13, 0, 0],
[ 0, 2, 0, 14, 0],
[ 0, 0, 3, 0, 15],
[ 6, 0, 0, 4, 0],
[ 0, 7, 0, 0, 5],
[ 0, 0, 8, 0, 0],
[ 0, 0, 0, 9, 0]])
6. 稀疏矩陣經(jīng)驗(yàn)
要有效地構(gòu)造矩陣,請(qǐng)使用dok_matrix或lil_matrix
lil_matrix類支持基本切片和花式索引,其語(yǔ)法與NumPy Array類似;lil_matrix形式是基于row的,因此能夠很高效的轉(zhuǎn)為csr,但是轉(zhuǎn)為csc效率相對(duì)較低。
要執(zhí)行乘法或轉(zhuǎn)置等操作,首先將矩陣轉(zhuǎn)換為CSC或CSR格式,效率高
CSR格式特別適用于快速矩陣矢量產(chǎn)品
CSR,CSC和COO格式之間的所有轉(zhuǎn)換都是線性復(fù)雜度。
到此這篇關(guān)于numpy稀疏矩陣的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)numpy 稀疏矩陣內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python調(diào)用SQLPlus來操作和解析Oracle數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了Python調(diào)用SQLPlus來操作和解析Oracle數(shù)據(jù)庫(kù)的方法,這樣用SQL*Plus方式來分析Oracle中的數(shù)據(jù)就變得十分方便,需要的朋友可以參考下2016-04-04
Pytorch卷積層手動(dòng)初始化權(quán)值的實(shí)例
今天小編就為大家分享一篇Pytorch卷積層手動(dòng)初始化權(quán)值的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08
python縮進(jìn)長(zhǎng)度是否統(tǒng)一
在本篇內(nèi)容里小編給大家整理的是一篇關(guān)于python縮進(jìn)長(zhǎng)度是否統(tǒng)一的相關(guān)知識(shí)點(diǎn),需要的朋友們可以學(xué)習(xí)下。2020-08-08
抵御代碼復(fù)雜性使python函數(shù)更加Pythonic技巧示例詳解
這篇文章主要介紹了抵御代碼復(fù)雜性使python函數(shù)更加Pythonic技巧示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
python中pandas庫(kù)的iloc函數(shù)用法解析
在 Pandas 中,.iloc 是一種用于基于整數(shù)位置進(jìn)行索引的屬性,可以用于獲取 DataFrame 或 Series 中的數(shù)據(jù),這篇文章主要介紹了python中pandas庫(kù)的iloc函數(shù)用法,需要的朋友可以參考下2023-05-05
Python多進(jìn)程協(xié)作模擬實(shí)現(xiàn)流程
當(dāng)多個(gè)進(jìn)程使用同一份數(shù)據(jù)資源的時(shí)候,因?yàn)檫M(jìn)程的運(yùn)行沒有順序,運(yùn)行起來也無法控制,如果不加以干預(yù),往往會(huì)引發(fā)數(shù)據(jù)安全或順序混亂的問題,所以要在多個(gè)進(jìn)程讀寫共享數(shù)據(jù)資源的時(shí)候加以適當(dāng)?shù)牟呗?,來保證數(shù)據(jù)的一致性問題2023-01-01

