Scipy稀疏矩陣bsr_array的使用
基本原理
bsr,即Block Sparse Row,bsr_array即塊稀疏行矩陣,顧名思義就是將稀疏矩陣分割成一個個非0的子塊,然后對這些子塊進(jìn)行存儲。通過輸入維度,可以創(chuàng)建一個空的bsr數(shù)組,但bsr格式并不可見,需要通過toarray轉(zhuǎn)為數(shù)組,才能一窺全貌。
from scipy.sparse import bsr_array import numpy as np import sys bsr = bsr_array((100, 200), dtype=np.int8) sys.getsizeof(bsr) # 48 bsr_arr = bsr.toarray() # 轉(zhuǎn)為數(shù)組 sys.getsizeof(bsr_arr) # 20120
egtsizeof可查看數(shù)據(jù)占用的內(nèi)存,其中bsr占用48byte,轉(zhuǎn)為數(shù)組之后占據(jù)20k,這就是稀疏矩陣存在的價值。
當(dāng)然,全零的數(shù)組就直接叫全零數(shù)組得了,直接存?zhèn)€行列數(shù)比bsr還省事兒,接下來構(gòu)造一個矩陣
from numpy.random import randint, rand tmp = np.zeros([200,200]) for i in range(30): ? ? x, y = randint(195, size=(2)) ? ? tmp[x:x+5, y:y+5]=rand(5,5) print(tmp.size) ? ? ? ? ? ?# 40000 bsr = bsr_array(tmp, blocksize=(5,5)) ? ? print(bsr.data.size) ? ? ? # 2850 print(bsr.indptr.size) ? ? # 41 print(bsr.indices.size) ? ?# 114 print(tmp.size)
bsr.data是bsr中存放的矩陣塊;bsr.indices為這些矩陣塊對應(yīng)的列號數(shù)組;bsr.indptr為索引的行分割數(shù)組;這些零零碎碎加在一起也只有3005個數(shù),和40k的tmp相比,可以說壓縮效率非常高了。
通過data, indptr和indices,可以將bsr復(fù)原為矩陣。首先,列號和數(shù)據(jù)是一一對應(yīng)的;其次indptr對索引和數(shù)據(jù)按行分割。在本例中,indptr的值為0, 2, 6, 8…,則data[0:2]存放在第0行,對應(yīng)的列號為indices[0:2];data[2:6]存放在第1行,對應(yīng)的列號為indices[2:6],以此類推。
初始化
bsr_array共有5種初始化方案:
- bsr_array(D) D是一個稀疏數(shù)組或2 × D 2\times D2×D數(shù)組
- bsr_array(S) S是另一種稀疏數(shù)組
- bsr_array((M, N),dtype) 創(chuàng)建一個shape為( M , N ) (M, N)(M,N)的空數(shù)組,dtype為數(shù)據(jù)類型
- bsr_array((data, ij)) ij是坐標(biāo)數(shù)組,可分解為i,j=ij,data是數(shù)據(jù)數(shù)組,設(shè)新矩陣為a,則a[i[k], j[k]] = data[k]
- bsr_array((data, indices, indptr))
前四種方法均有參數(shù)blocksize,為塊尺寸;后兩種方法均有參數(shù)shape,為稀疏矩陣的維度。
從原理上來說,通過data, indices, indptr來創(chuàng)建的bsr數(shù)組,屬于"原生"的bsr數(shù)組,其創(chuàng)建規(guī)則就是前文提到的復(fù)原規(guī)則。
內(nèi)置方法
稀疏數(shù)組在計(jì)算上并不便捷,所以bsr_array中內(nèi)置了下列函數(shù),可以高效地完成計(jì)算。
函數(shù) | expm1 , log1p , sqrt , pow , sign |
三角函數(shù) | sin , tan , arcsin , arctan , deg2rad , rad2deg |
雙曲函數(shù) | sinh , tanh , arcsinh , arctanh |
索引 | getcol , getrow , nonzero , argmax , argmin , max , min |
舍入 | ceil , floor , trunc |
變換 | conj , conjugate , getH |
統(tǒng)計(jì) | count_nonzero , getnnz , mean , sum |
矩陣 | diagonal , trace |
獲取屬性 | get_shape , getformat |
計(jì)算比較 | multiply , dot , maximum , minimum |
轉(zhuǎn)換 | asformat , asfptype , astype , toarray , todense |
轉(zhuǎn)換 | tobsr , tocoo , tocsc , tocsr , todia , todok , tolil |
更改維度 | set_shape , reshape , resize , transpose |
排序 | sort_indices , sorted_indices |
移除元素 | eliminate_zeros , prune , sum_duplicates |
其他 | copy , check_format , getmaxprint , rint , setdiag |
到此這篇關(guān)于Scipy稀疏矩陣bsr_array的使用的文章就介紹到這了,更多相關(guān)Scipy稀疏矩陣bsr_array內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python與matlab一些常用函數(shù)互轉(zhuǎn)問題
這篇文章主要介紹了python與matlab一些常用函數(shù)互轉(zhuǎn),包括十六進(jìn)制字節(jié)流數(shù)據(jù)的相關(guān)知識,本文通過示例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下2022-12-12python使用difflib實(shí)現(xiàn)自動查重
Python中有許多現(xiàn)成的庫和工具,可以方便地實(shí)現(xiàn)自動查重的功能,其中,difflib庫就是一個專門用于比較文件和字符串差異的庫,下面我們就來看看如何利用difflib實(shí)現(xiàn)自動查重吧2023-11-11