最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python稀疏矩陣scipy.sparse包使用詳解

 更新時間:2023年02月16日 09:52:40   作者:篤℃  
本文主要介紹了Python稀疏矩陣scipy.sparse包使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1. 前言

數(shù)組和矩陣是數(shù)值計算的基礎(chǔ)元素。目前為止,我們都是使用NumPy的ndarray數(shù)據(jù)結(jié)構(gòu)來表示數(shù)組,這是一種同構(gòu)的容器,用于存儲數(shù)組的所有元素。

有一種特殊情況,矩陣的大部分元素都為零,這種矩陣被稱為稀疏矩陣。對于稀疏矩陣,將所有零保存在計算機內(nèi)存中的效率很低,更合適的方法是只保存非零元素以及位置信息。于是SciPy應(yīng)運而生,為稀疏矩陣的表示及其線性代數(shù)運算提供了豐富易用的接口。

2. 導(dǎo)入包

SciPy中提供了稀疏矩陣模塊scipy.sparse,為稀疏矩陣的表示及其線性代數(shù)運算提供了豐富易用的接口。

import scipy.sparse as sp
import scipy.sparse.linalg
import scipy.linalg as la

3. 稀疏矩陣總覽

There are seven available sparse matrix types:
    1. csc_matrix: Compressed Sparse Column format
    2. csr_matrix: Compressed Sparse Row format
    3. bsr_matrix: Block Sparse Row format
    4. lil_matrix: List of Lists format
    5. dok_matrix: Dictionary of Keys format
    6. coo_matrix: COOrdinate format (aka IJV, triplet format)
    7. dia_matrix: DIAgonal format
  • sp.coo_matrix(坐標(biāo)的列表)描述:將非零值及其行列信息保存在一個列表。構(gòu)造簡單,添加元素方便,但訪問元素效率低下;
  • sp.lil_matrix(列表的列表):將每行的非零元素列索引保存在一個列表,將對應(yīng)值保存在另一個列表。支持切片操作,但不方便進行數(shù)學(xué)運算;
  • sp.dok_matrix(值的字典):將非零值保存在字典,非零值的坐標(biāo)元組作為字典的鍵。構(gòu)造簡單,可快速添加刪除元素,但不方便進行數(shù)學(xué)運算;
  • sp.dia_matrix(對角矩陣):矩陣的對角線列表 。對于對角矩陣非常有效 ,但不適用非對角矩陣;
  • sp.csc_matrix 和 sp.csr_matrix(壓縮列格式和壓縮行格式):將值與行列索引的數(shù)組一起存儲。對于矩陣的向量乘法很高效,但構(gòu)造相對復(fù)雜;
  • sp.bsr_matrix(塊稀疏矩陣):與CSR類似,用于具有稠密子矩陣的稀疏矩陣。對于此類特殊矩陣很高效,但不適用一般矩陣。

注意:

  • 為了有效地構(gòu)建矩陣,使用dok_matrix或者lil_matrix,lil_matrix類支持基本的切片和索引操作,語法與NumPy的arrays相似。
  • COO格式也能有效率地構(gòu)建矩陣。盡管與NumPy有許多相似性,但是強烈不建議使用NumPy的函數(shù)直接對稀疏矩陣格式進行操作,因為可能導(dǎo)致不正確的結(jié)果。如果將NumPy的函數(shù)用在這些矩陣上,首先檢查SciPy在對應(yīng)的稀疏矩陣類上有沒有已經(jīng)實現(xiàn)的操作,或者使用toarray()方法將稀疏矩陣對象轉(zhuǎn)為NumPy的array。
  • 實現(xiàn)乘法與轉(zhuǎn)置操作,則轉(zhuǎn)為CSC或CSR格式,lil_matrix格式是基于行的,所以轉(zhuǎn)為為CSR比CSC更有效率。所有的轉(zhuǎn)換在CSR,CSC和COO格式之間都是有效的,線性時間操作。

4. 稀疏矩陣詳細介紹

4.1 coo_matrix

coo_matrix是最簡單的存儲方式。采用三個數(shù)組row、col和data保存非零元素的行下標(biāo),列下標(biāo)與值。這三個數(shù)組的長度相同一般來說,coo_matrix主要用來創(chuàng)建矩陣,因為coo_matrix無法對矩陣的元素進行增刪改等操作,一旦創(chuàng)建之后,除了將之轉(zhuǎn)換成其它格式的矩陣,幾乎無法對其做任何操作和矩陣運算。

1

為了創(chuàng)建sp.coo_matrix對象,需要創(chuàng)建非零值、行索引以及列索引的列表或數(shù)組,并將其傳遞給生成函數(shù)sp.coo_matrix。

values = [1, 2, 3, 4]
rows = [0, 1, 2, 3]
cols = [1, 3, 2, 0]
A = sp.coo_matrix((values, (rows, cols)), shape=[4, 4])
A

2

>>> A.toarray()
array([[1, 0, 0, 0],
       [0, 0, 0, 2],
       [0, 0, 3, 0],
       [4, 0, 0, 0]])
>>> type(A)
<class 'scipy.sparse.coo.coo_matrix'>
>>> type(A.toarray())
<class 'numpy.ndarray'>

SciPy的sparse模塊中稀疏矩陣的屬性大部分派生自NumPy的ndarray對象,同時也包括nnz(非零元素數(shù)目)和data(非零值)等屬性。

A.shape, A.size, A.dtype, A.ndim

3

A.nnz, A.data

在這里插入圖片描述

對于sp.coo_matrix對象,還可以使用row和col屬性來訪問底層的行列坐標(biāo)數(shù)組。

A.row, A.col

4.2 dok_matrix

dok_matrix適用的場景是逐漸添加矩陣的元素。dok_matrix的策略是采用字典來記錄矩陣中不為0的元素。所以字典的key存的是記錄元素的位置信息的元祖,value是記錄元素的具體值。

>>> S = sparse.dok_matrix((5, 5), dtype=np.float32)
>>> for i in range(5):
    	for j in range(5):
        	S[i,j] = i+j    # 更新元素
>>> S.toarray()
[[0. 1. 2. 3. 4.]
 [1. 2. 3. 4. 5.]
 [2. 3. 4. 5. 6.]
 [3. 4. 5. 6. 7.]
 [4. 5. 6. 7. 8.]]

優(yōu)點:對于遞增的構(gòu)建稀疏矩陣很高效,比如定義該矩陣后,想進行每行每列更新值,可用該矩陣。當(dāng)訪問某個單元,只需要O(1)

缺點:不允許重復(fù)索引(coo中適用),但可以很高效的轉(zhuǎn)換成coo后進行重復(fù)索引。

4.3 lil_matrix

lil_matrix適用的場景也是逐漸添加矩陣的元素。與dok不同,lil_matrix則是使用兩個列表存儲非0元素。data保存每行中的非零元素,rows保存非零元素所在的列。這種格式也很適合逐個添加元素,并且能快速獲取行相關(guān)的數(shù)據(jù)。

>>> l = sparse.lil_matrix((4, 4))
>>> l[1, 1] = 1
>>> l[1, 3] =2
>>> l[2, 3] = 3
>>> l.toarray()
array([[0., 0., 0., 0.],
       [0., 1., 0., 2.],
       [0., 0., 0., 3.],
       [0., 0., 0., 0.]])
>>> l.data
array([list([]), list([1.0, 2.0]), list([3.0]), list([])], dtype=object)
>>> l.rows
array([list([]), list([1, 3]), list([3]), list([])], dtype=object)

優(yōu)點:適合遞增的構(gòu)建成矩陣、轉(zhuǎn)換成其它存儲方式很高效、支持靈活的切片。

缺點:當(dāng)矩陣很大時,考慮用coo、算術(shù)操作,列切片,矩陣向量內(nèi)積操作慢。

4.4 dia_matrix

如果稀疏矩陣僅包含非0元素的對角線,則對角存儲格式(DIA)可以減少非0元素定位的信息量。這種存儲格式對有限元素或者有限差分離散化的矩陣尤其有效。dia_matrix通過兩個數(shù)組確定: data和offsets。其中data對角線元素的值;offsets:第i個offsets是當(dāng)前第i個對角線和主對角線的距離。data[k:]存儲了offsets[k]對應(yīng)的對角線的全部元素。例子如下:

在這里插入圖片描述

>>> data = np.array([[1, 2, 3, 4], [5, 6, 0, 0], [0, 7, 8, 9]])
>>> offsets = np.array([0, -2, 1])
>>> sparse.dia_matrix((data, offsets), shape=(4, 4)).toarray()
array([[1, 7, 0, 0],
       [0, 2, 8, 0],
       [5, 0, 3, 9],
       [0, 6, 0, 4]])

注意:offsets[0]=0表示第0個對角線與主對角線的距離為0,表示第0個對角線就是主對角線,data[0]就是第0個對角線的值。offsets[1]=-2表示第1個對角線與主對角線距離為-2,此時該對角線在主對角線的左下方,對角線上數(shù)值的數(shù)量為4-2=2,對應(yīng)的值為data[1, :2+1],此時data[1, 3:]為無效的值,在構(gòu)造對角稀疏矩陣時不起作用。offsets[2]=1表示第2個對角線與主對角線距離為1,此時該對角線在主對角線的右上方,對角線上數(shù)值的數(shù)量為4-1=3,對應(yīng)的值為data[2, 1:],此時data[2, :1]為無效的值,在構(gòu)造對角稀疏矩陣時不起作用。

4.5 csc_matrix & csr_matrix

csr_matrix是按行對矩陣進行壓縮的,csc_matrix則是按列對矩陣進行壓縮的。通過row_offsets,column_indices,data來確定矩陣。column_indices,data與coo格式的列索引與數(shù)值的含義完全相同,row_offsets表示元素的行偏移量。例子如下,

>>> 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_matrix((data, indices, indptr), shape=(3, 3)).toarray()
array([[1, 0, 2],
       [0, 0, 3],
       [4, 5, 6]])

注意:indices和data分別表示列索引和數(shù)據(jù),第 i 行的列索引存儲在indices[indptr[i]:indptr[i+1]] 中,對應(yīng)的值為data[indptr[i]:indptr[i+1]]。即第0行的列索引為indices[0:2]=[0,2],值為data[0:2]=[1,2];第1行的列索引為indices[2:3]=[2],值為data[2:3]=[3]…

CSR格式常用于讀入數(shù)據(jù)后進行稀疏矩陣計算。

兩者的優(yōu)缺點互反:

  • CSR優(yōu)點:高效的稀疏矩陣算術(shù)操作、高效的行切片、快速地矩陣向量內(nèi)積操作;
  • CSR缺點:緩慢地列切片操作(可以考慮csc)、轉(zhuǎn)換到稀疏結(jié)構(gòu)代價較高(可以考慮lil,dok)。
  • CSC優(yōu)點:高效的稀疏矩陣算術(shù)操作、高效的列切片、快速地矩陣向量內(nèi)積操作(不如csr,bsr塊);
  • CSC缺點:緩慢地行切片操作(可以考慮csr)、 轉(zhuǎn)換到稀疏結(jié)構(gòu)代價較高(可以考慮lil,dok)。

4.6 bsr_matrix

基于行的塊壓縮,通過row_offsets,column_indices,data來確定矩陣。與csr相比,只是data中的元數(shù)據(jù)由0維的數(shù)變?yōu)榱艘粋€矩陣(塊),其余完全相同。

>>> 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]).repeat(4).reshape(6,2,2)
>>> bsr_matrix((data,indices,indptr), shape=(6,6)).todense()
matrix([[1, 1, 0, 0, 2, 2],
        [1, 1, 0, 0, 2, 2],
        [0, 0, 0, 0, 3, 3],
        [0, 0, 0, 0, 3, 3],
        [4, 4, 5, 5, 6, 6],
        [4, 4, 5, 5, 6, 6]])

優(yōu)點:很類似于csr,更適合于矩陣的某些子矩陣很多值,在某些情況下比csr和csc計算更高效。

5. 稀疏矩陣的存取

5.1 用save_npz保存單個稀疏矩陣

>>> scipy.sparse.save_npz('sparse_matrix.npz', sparse_matrix)
>>> sparse_matrix = scipy.sparse.load_npz('sparse_matrix.npz')

稀疏矩陣存儲大小比較:

a = np.arange(100000).reshape(1000,100)
a[10: 300] = 0
b = sparse.csr_matrix(a)
# 稀疏矩陣壓縮存儲到npz文件
sparse.save_npz('b_compressed.npz', b, True)  # 文件大?。?00KB
# 稀疏矩陣不壓縮存儲到npz文件
sparse.save_npz('b_uncompressed.npz', b, False)  # 文件大小:560KB
# 存儲到普通的npy文件
np.save('a.npy', a)  # 文件大?。?91KB
# 存儲到壓縮的npz文件
np.savez_compressed('a_compressed.npz', a=a)  # 文件大小:97KB

對于存儲到npz文件中的CSR格式的稀疏矩陣,內(nèi)容為:

data.npy
format.npy
indices.npy
indptr.npy
shape.npy

6. 總結(jié)

加載數(shù)據(jù)文件時使用coo_matrix快速構(gòu)建稀疏矩陣,然后調(diào)用to_csr()、to_csc()、to_dense()把它轉(zhuǎn)換成CSR或稠密矩陣(numpy.matrix)。

coo_matrix格式常用于從文件中進行稀疏矩陣的讀寫,而csr_matrix格式常用于讀入數(shù)據(jù)后進行稀疏矩陣計算。

7. 參考

【1】https://blog.csdn.net/winycg/article/details/80967112
【2】https://blog.csdn.net/vor234/article/details/124935384

到此這篇關(guān)于Python稀疏矩陣scipy.sparse包使用詳解的文章就介紹到這了,更多相關(guān)Python稀疏矩陣內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python中條件判斷語句的簡單使用方法

    Python中條件判斷語句的簡單使用方法

    這篇文章主要介紹了Python中條件判斷語句的簡單使用方法,是Python入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-08-08
  • 代碼詳解Python的函數(shù)基礎(chǔ)(2)

    代碼詳解Python的函數(shù)基礎(chǔ)(2)

    這篇文章主要為大家詳細介紹了Python的函數(shù)基礎(chǔ),使用了函數(shù)參數(shù)和遞歸函數(shù),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Python模塊搜索概念介紹及模塊安裝方法介紹

    Python模塊搜索概念介紹及模塊安裝方法介紹

    這篇文章主要介紹了Python模塊搜索概念介紹及模塊安裝方法介紹,本文詳細講解了import模塊的運作原理,搜索路徑的過程以及模塊安裝的多種方法,需要的朋友可以參考下
    2015-06-06
  • 教你使用Psycopg2連接openGauss的方法

    教你使用Psycopg2連接openGauss的方法

    Psycopg是一種用于執(zhí)行SQL語句的PythonAPI,可以為PostgreSQL、openGauss數(shù)據(jù)庫提供統(tǒng)一訪問接口,應(yīng)用程序可基于它進行數(shù)據(jù)操作,這篇文章主要介紹了教你使用Psycopg2連接openGauss的方法,需要的朋友可以參考下
    2022-11-11
  • Python寫UI自動化之playwright(點擊操作)詳解

    Python寫UI自動化之playwright(點擊操作)詳解

    這篇文章主要介紹了Playwright庫中click()方法的參數(shù)及其使用場景,包括選擇器、修飾鍵、點擊位置、鼠標(biāo)按鈕、點擊次數(shù)、延遲、超時、強制點擊、試點擊和不等待導(dǎo)航等選項,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-02-02
  • 在Python中使用K-Means聚類和PCA主成分分析進行圖像壓縮

    在Python中使用K-Means聚類和PCA主成分分析進行圖像壓縮

    這篇文章主要介紹了在Python中使用K-Means聚類和PCA主成分分析進行圖像壓縮,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Python中set與frozenset方法和區(qū)別詳解

    Python中set與frozenset方法和區(qū)別詳解

    這篇文章主要介紹了Python中set與frozenset方法和區(qū)別詳解的相關(guān)資料,需要的朋友可以參考下
    2016-05-05
  • PyQt5使用pyqtgraph繪制波形圖

    PyQt5使用pyqtgraph繪制波形圖

    pyqtgraph是Python平臺上一種功能強大的2D/3D繪圖庫,相當(dāng)于matplotlib庫,比它更強大。本文就來利用pyqtgraph實現(xiàn)繪制波形圖,需要的可以參考一下
    2023-01-01
  • Python利用PyMuPDF模塊實現(xiàn)快速轉(zhuǎn)換PDF文件

    Python利用PyMuPDF模塊實現(xiàn)快速轉(zhuǎn)換PDF文件

    PDF是一種廣泛使用的文件格式,可以在任何設(shè)備上查看和打印,那么如何用Python和PyMuPDF制作你想要大小的PDF文件呢,本文就來和大家詳細講講
    2023-08-08
  • Python實現(xiàn)控制臺輸入密碼的方法

    Python實現(xiàn)控制臺輸入密碼的方法

    這篇文章主要介紹了Python實現(xiàn)控制臺輸入密碼的方法,實例對比分析了幾種輸入密碼的方法,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-05-05

最新評論

五家渠市| 二手房| 肥乡县| 青神县| 庐江县| 汾西县| 绥宁县| 修武县| 横山县| 平陆县| 玛沁县| 荔浦县| 开封市| 临沂市| 武冈市| 苍溪县| 隆林| 文成县| 香格里拉县| 溧阳市| 吉木萨尔县| 闵行区| 衡阳县| 阳泉市| 滦平县| 勃利县| 仪陇县| 南靖县| 乐亭县| 富顺县| 雷山县| 镇康县| 饶平县| 登封市| 南投县| 凯里市| 兴文县| 保德县| 奉新县| 建平县| 屯门区|