稀疏矩陣定義以及存儲格式(COO,CSR,CSC)

稀疏矩陣定義

百度百科:在矩陣中赖钞,若數(shù)值為0的元素數(shù)目遠遠多于非0元素的數(shù)目需纳,并且非0元素分布沒有規(guī)律時,則稱該矩陣為稀疏矩陣蛤织;與之相反赴叹,若非0元素數(shù)目占大多數(shù)時,則稱該矩陣為稠密矩陣指蚜。定義非零元素的總數(shù)比上矩陣所有元素的總數(shù)為矩陣的稠密度乞巧。簡單來說,稀疏矩陣就是絕大部分都是0的矩陣,只包含很少的非零值.

比如,


image.png

上述稀疏矩陣非零元素有9個,26個零值.稀疏性是74%.

稀疏矩陣因為絕大部分都是0元素,如果我們?nèi)匀话凑掌胀ǚ绞酱鎯?無疑會浪費很多空間;同時如果進行運算時,0元素對最終結(jié)果也沒有幫助,增加了許多無效計算. 因此,我們需要設(shè)計出新的存儲方式,或者說數(shù)據(jù)結(jié)構(gòu)來存儲稀疏矩陣.比較常見的有:

  • DOK:Dictionary of keys.將非零元素的坐標(row,column)作為key,非零元素值作為value;同時只存儲非零元素值,零值被扔掉.可以以任意順序逐漸構(gòu)建稀疏矩陣;但是按某種順序訪問非零元素時比較困難.通常用來構(gòu)建矩陣,然后再把矩陣轉(zhuǎn)換成別的方式.
  • COO:Coordinate list,坐標格式.三個數(shù)組row,col,value,分別存儲非零元素坐標的行,列以及非零值.理論上稀疏矩陣中的元素在存儲時順序是任意的,但是為了方便元素訪問,存儲時先按照先左后右,先上后下順序進行存儲(left to right, top to buttom).
  • CSR:壓縮稀疏行
  • CSC:壓縮稀疏列,和CSR類似.

稀疏矩陣存儲

對于稀疏矩陣的存儲,為了達到壓縮的目的(節(jié)省存儲空間),只存儲非0元素值,但是也要保留非零元素的位置,方便恢復(fù).所以,我們存儲時不僅存儲非零元素值,同時存儲其坐標位置(row,column). 針對這兩者的存儲,會出現(xiàn)不同的設(shè)計方案.這里主要介紹COO,CSR和CSC存儲格式.

COO

我們使用三個數(shù)組row,column和data分別用來存儲非零元素坐標的row_index,col_index,以及數(shù)值.比如:

image

NNO:The number of nonzero.矩陣非零元素個數(shù). 三個數(shù)組的長度都是NNO.data[i]在原稀疏矩陣中的坐標為(row[i],col[i]]).

>>> from scipy.sparse import *
>>> 
>>> row = [0,0,1,1,2,2,2,3,3]
>>> col = [0,1,1,2,0,2,3,1,3]
>>> data = [1,7,2,8,5,3,9,6,4]
>>> import numpy as np
>>> coo = coo_matrix((data,(row,col)),shape=(4,4),dtype=np.int)
>>> coo
<4x4 sparse matrix of type '<class 'numpy.int64'>'
    with 9 stored elements in COOrdinate format>
>>> coo.todense()
matrix([[1, 7, 0, 0],
        [0, 2, 8, 0],
        [5, 0, 3, 9],
        [0, 6, 0, 4]])

可以發(fā)現(xiàn),這種存儲方式中,row數(shù)組和column數(shù)組中有一定的重復(fù)元素.我們是否可以針對這個冗余特性進一步進行壓縮?之后出現(xiàn)CSR,CSC,分別是對row數(shù)組和column數(shù)組進行了壓縮.

CSR

  • NNO:稀疏矩陣非零元素個數(shù);
  • M:稀疏矩陣行數(shù);
  • N:稀疏矩陣列數(shù).

對COO稀疏矩陣存儲格式的三個數(shù)組中的row數(shù)組進行壓縮.其他兩個數(shù)組保持不變;三個數(shù)組分別是row_ptr,columns和data.其中columns和data數(shù)組長度均為NNO(矩陣的非零元素個數(shù)).如何對COO的row進行壓縮?

row_ptr存儲的是每行的第一個非零元素距離稀疏矩陣第一個元素的偏移位置;

  • row_ptr:長度為M+1.
  • row_ptr[0] = 0
  • row_ptr[i] = row_ptr[i-1] + nno(rows[i-1])[第i-1行非零元素個數(shù)]
  • row_ptr[M] = NNO.

由row_ptr我們可以知道每行非零元素在data中的index范圍.第i行的非零元素為data[row_ptr[i]:row_ptr[i+1]],對data數(shù)組的切片,不包含data[row_ptr[i+1]];同時第i行非零元素的col坐標分別為columns[row_ptr[i]:row_ptr[i+1]];對data和columns的訪問相似,index是相同的.

image

如上圖中,第0行非零元素在data中是data[0:2],就是1,7;列坐標為columns[0:2],就是0,1,第1行非零元素為data[2:4],有兩個元素2和8,列坐標分別為columns[2:4],1和2.

>>> row_ptr = [0,2,4,7,9]
>>> col = [0,1,1,2,0,2,3,1,3]
>>> data = [1,7,2,8,5,3,9,6,4]
>>> csr = csr_matrix((data,col,row_ptr),shape=(4,4),dtype=np.int)# 被壓縮的數(shù)組放在最后一個
>>> csr.todense()
matrix([[1, 7, 0, 0],
        [0, 2, 8, 0],
        [5, 0, 3, 9],
        [0, 6, 0, 4]])

方便進行行操作.

CSC

和CSR類似.只不過對列進行壓縮,row和data保持不變.

方便進行列操作.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市摊鸡,隨后出現(xiàn)的幾起案子绽媒,更是在濱河造成了極大的恐慌,老刑警劉巖免猾,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件是辕,死亡現(xiàn)場離奇詭異,居然都是意外死亡猎提,警方通過查閱死者的電腦和手機获三,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人疙教,你說我怎么就攤上這事棺聊。” “怎么了贞谓?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵躺屁,是天一觀的道長。 經(jīng)常有香客問我经宏,道長,這世上最難降的妖魔是什么驯击? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任烁兰,我火速辦了婚禮,結(jié)果婚禮上徊都,老公的妹妹穿的比我還像新娘沪斟。我一直安慰自己,他們只是感情好暇矫,可當我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布主之。 她就那樣靜靜地躺著,像睡著了一般李根。 火紅的嫁衣襯著肌膚如雪槽奕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天房轿,我揣著相機與錄音粤攒,去河邊找鬼。 笑死囱持,一個胖子當著我的面吹牛夯接,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播纷妆,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼盔几,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了掩幢?” 一聲冷哼從身側(cè)響起逊拍,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎粒蜈,沒想到半個月后顺献,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡枯怖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年注整,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡肿轨,死狀恐怖寿冕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情椒袍,我是刑警寧澤驼唱,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站驹暑,受9級特大地震影響玫恳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜优俘,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一京办、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧帆焕,春花似錦惭婿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至折晦,卻和暖如春钥星,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背筋遭。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工打颤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人漓滔。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓编饺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親响驴。 傳聞我的和親對象是個殘疾皇子透且,可洞房花燭夜當晚...
    茶點故事閱讀 45,922評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 稀疏矩陣 在矩陣中,若數(shù)值為0的元素數(shù)目遠遠多于非0元素的數(shù)目時豁鲤,則稱該矩陣為稀疏矩陣秽誊。與之相反,若非0元素數(shù)目占...
    Skye_kh閱讀 3,612評論 1 5
  • 如果將整個稀疏矩陣都存儲進入內(nèi)存中的話, 那將會占用相當大的空間, 根據(jù)稀疏矩陣中非0元素在矩陣中的分布以及個數(shù),...
    Teci閱讀 4,476評論 2 1
  • 7稀疏矩陣 稀疏矩陣是一種特殊類型的矩陣琳骡,即矩陣中包括較多的零元素锅论。對于稀疏矩陣的這種特性,在MATLAB中可以只...
    校苑數(shù)模閱讀 2,773評論 0 1
  • 什么是稀疏矩陣楣号? 大多數(shù)元素都是0的矩陣稱為稀疏矩陣最易,否則稱為稠密矩陣怒坯。規(guī)模巨大的稀疏矩陣在應(yīng)用機器學(xué)習(xí)中很常見,...
    CourageK閱讀 5,954評論 0 2
  • 1.青春不能給你帶來財富藻懒,但奮斗能剔猿。 那我去做小姐呢? 2.有人說我是gay嬉荆,我很生氣归敬,怎么可以這樣說呢,我明明就...
    悟空_def8閱讀 298評論 0 0