亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

python scipy 稀疏矩陣的使用說明

瀏覽:3日期:2022-06-18 11:50:47
稀疏矩陣格式 coo_matrixcoo_matrix

是最簡單的稀疏矩陣存儲方式,采用三元組(row, col, data)(或稱為ijv format)的形式來存儲矩陣中非零元素的信息。

在實際使用中,一般coo_matrix用來創建矩陣,因為coo_matrix無法對矩陣的元素進行增刪改操作;創建成功之后可以轉化成其他格式的稀疏矩陣(如csr_matrix、csc_matrix)進行轉置、矩陣乘法等操作。

python scipy 稀疏矩陣的使用說明

coo_matrix可以通過四種方式實例化,除了可以通過coo_matrix(D), D代表密集矩陣;coo_matrix(S), S代表其他類型稀疏矩陣或者coo_matrix((M, N), [dtype])構建一個shape為M*N的空矩陣,默認數據類型是d,還可以通過(row, col, data)三元組初始化:

>>> 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方法轉化成密集矩陣(numpy.matrix)>>> coo.toarray() # 通過toarray方法轉化成密集矩陣(numpy.ndarray)array([[4, 0, 9, 0], [0, 7, 0, 0], [0, 0, 0, 0], [0, 0, 0, 5]])

上面通過triplet format的形式構建了一個coo_matrix對象,我們可以看到坐標點(0,0)對應值為4,坐標點(1,1)對應值為7等等,這就是coo_matrix。coo_matrix對象有很多方法,大多數是elementwise的操作函數;coo_matrix對象有以下屬性:

dtype dtype

矩陣中元素的數據類型

shape 2-tuple

獲取矩陣的shape

ndim int

獲取矩陣的維度,當然值是2咯

nnz

存儲值的個數,包括顯示聲明的零元素(注意)

data

稀疏矩陣存儲的值,是一個一維數組,即上面例子中的_data

row

與data同等長度的一維數組,表征data中每個元素的行號

col

與data同等長度的一維數組,表征data中每個元素的列號

在實際應用中,coo_matrix矩陣文件通常存成以下形式,表示稀疏矩陣是coo_matrix(coordinate),由13885行1列組成,共有949個元素值為非零,數據類型為整形。

python scipy 稀疏矩陣的使用說明

​ 下面給出coo_matrix矩陣文件讀寫示例代碼,mmread()用于讀取稀疏矩陣,mmwrite()用于寫入稀疏矩陣,mminfo()用于查看稀疏矩陣文件元信息。(這三個函數的操作不僅僅限于coo_matrix)

from scipy.io import mmread, mmwrite, mminfoHERE = dirname(__file__)coo_mtx_path = join(HERE, ’data/matrix.mtx’)coo_mtx = mmread(coo_mtx_path)print(mminfo(coo_mtx_path))# (13885, 1, 949, ’coordinate’, ’integer’, ’general’)# (rows, cols, entries, format, field, symmetry)mmwrite(join(HERE, ’data/saved_mtx.mtx’), coo_mtx)

coo_matrix的優點:

有利于稀疏格式之間的快速轉換(tobsr()、tocsr()、to_csc()、to_dia()、to_dok()、to_lil())

允許又重復項(格式轉換的時候自動相加)

能與CSR / CSC格式的快速轉換

coo_matrix的缺點:

不能直接進行算術運算

csr_matrix ​

csr_matrix,全稱Compressed Sparse Row matrix,即按行壓縮的稀疏矩陣存儲方式,由三個一維數組indptr, indices, data組成。

這種格式要求矩陣元按行順序存儲,每一行中的元素可以亂序存儲。

那么對于每一行就只需要用一個指針表示該行元素的起始位置即可。

indptr存儲每一行數據元素的起始位置,indices這是存儲每行中數據的列號,與data中的元素一一對應。

python scipy 稀疏矩陣的使用說明

csr_matrix可用于各種算術運算:它支持加法,減法,乘法,除法和矩陣冪等操作。

其有五種實例化方法,其中前四種初始化方法類似coo_matrix,即通過密集矩陣構建、通過其他類型稀疏矩陣轉化、構建一定shape的空矩陣、通過(row, col, data)構建矩陣。

其第五種初始化方式這是直接體現csr_matrix的存儲特征:csr_matrix((data, indices, indptr), [shape=(M, N)]),意思是,矩陣中第i行非零元素的列號為indices[indptr[i]:indptr[i+1]],相應的值為data[indptr[i]:indptr[i+1]]

舉個例子:

>>> 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]])

csr_matrix同樣有很多方法,其中tobytes(),tolist(), tofile(),tostring()值得注意,其他具體參考官方文檔,csr_matrix對象屬性前五個同coo_matrix,另外還有屬性如下:

indices

與屬性data一一對應,元素值代表在某一行的列號

indptr

csr_matrix各行的起始值,length(csr_object.indptr) == csr_object.shape[0] + 1

has_sorted_indices

判斷每一行的indices是否是有序的,返回bool值

csr_matrix的優點:

高效的算術運算CSR + CSR,CSR * CSR等高效的行切片快速矩陣運算

csr_matrix的缺點:

列切片操作比較慢(考慮csc_matrix)稀疏結構的轉換比較慢(考慮lil_matrix或doc_matrix)

csc_matrix

​ csc_matrix和csr_matrix正好相反,即按列壓縮的稀疏矩陣存儲方式,同樣由三個一維數組indptr, indices, data組成,如下圖所示:

python scipy 稀疏矩陣的使用說明

其實例化方式、屬性、方法、優缺點和csr_matrix基本一致,這里不再贅述,它們之間唯一的區別就是按行或按列壓縮進行存儲。

而這一區別決定了csr_matrix擅長行操作;csc_matrix擅長列操作,進行運算時需要進行合理存儲結構的選擇。

lil_matrix

​ lil_matrix,即List of Lists format,又稱為Row-based linked list sparse matrix。它使用兩個嵌套列表存儲稀疏矩陣:data保存每行中的非零元素的值,rows保存每行非零元素所在的列號(列號是順序排序的)。

這種格式很適合逐個添加元素,并且能快速獲取行相關的數據。

其初始化方式同coo_matrix初始化的前三種方式:通過密集矩陣構建、通過其他矩陣轉化以及構建一個一定shape的空矩陣。

python scipy 稀疏矩陣的使用說明

lil_matrix可用于算術運算:支持加法,減法,乘法,除法和矩陣冪。其屬性前五個同coo_matrix,另外還有rows屬性,是一個嵌套List,表示矩陣每行中非零元素的列號。

LIL matrix本身的設計是用來方便快捷構建稀疏矩陣實例,而算術運算、矩陣運算則轉化成CSC、CSR格式再進行,構建大型的稀疏矩陣還是推薦使用COO格式。

LIL format優點

支持靈活的切片操作行切片操作效率高,列切片效率低

稀疏矩陣格式之間的轉化很高效(tobsr()、tocsr()、to_csc()、to_dia()、to_dok()、to_lil())

LIL format缺點

加法操作效率低 (consider CSR or CSC)

列切片效率低(consider CSC)

矩陣乘法效率低 (consider CSR or CSC)

dok_matrix ​

dok_matrix,即Dictionary Of Keys based sparse matrix,是一種類似于coo matrix但又基于字典的稀疏矩陣存儲方式,key由非零元素的的坐標值tuple(row, column)組成,value則代表數據值。

dok matrix非常適合于增量構建稀疏矩陣,并一旦構建,就可以快速地轉換為coo_matrix。

其屬性和coo_matrix前四項同;其初始化方式同coo_matrix初始化的前三種:通過密集矩陣構建、通過其他矩陣轉化以及構建一個一定shape的空矩陣。

對于dok matrix,可用于算術運算:它支持加法,減法,乘法,除法和矩陣冪;允許對單個元素進行快速訪問( O(1) ); 不允許重復。

>>> 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

在上面代碼最后可以看到,實際上dok_matrix實例也是dict實例,在實現上繼承了dict類。

dia_matrix

​ dia_matrix,全稱Sparse matrix with DIAgonal storage,是一種對角線的存儲方式。

如下圖中,將稀疏矩陣使用offsets和data兩個矩陣來表示。offsets表示data中每一行數據在原始稀疏矩陣中的對角線位置k(k>0, 對角線往右上角移動;k<0, 對角線往左下方移動;k=0,主對角線)。

該格式的稀疏矩陣可用于算術運算:它們支持加法,減法,乘法,除法和矩陣冪。

python scipy 稀疏矩陣的使用說明

​dia_matrix五個屬性同coo matrix, 另外還有屬性offsets;dia_matrix有四種初始化方式,其中前三種初始化方式同coo_matrix前三種初始化方式,即:通過密集矩陣構建、通過其他矩陣轉化以及構建一個一定shape的空矩陣。

第四種初始化方式如下:

dia_matrix((data, offsets), shape=(M, N)) ,

​ 其中,data[k,:]存儲著稀疏矩陣offsets[k]對角線上的值

>>> 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]])

不是很常用,了解即可

bsr_matrix

​ bsr_matrix,全稱Block Sparse Row matrix,這種壓縮方式極其類似CSR格式,但使用分塊的思想對稀疏矩陣進行按行壓縮。所以,BSR適用于具有dense子矩陣的稀疏矩陣。該種矩陣有五種初始化方式,分別如下:

bsr_matrix(D, [blocksize=(R,C)])

D是一個M*N的二維dense矩陣;blocksize需要滿足條件:M % R = 0和N % C = 0,若不給定該參數,內部將會應用啟發式的算法自動決定一個合適的blocksize.

bsr_matrix(S, [blocksize=(R,C)])

S是指其他類型的稀疏矩陣

bsr_matrix((M, N), [blocksize=(R,C), dtype])

構建一個shape為M*N的空矩陣

bsr_matrix((data, ij), [blocksize=(R,C), shape=(M, N)])

data 和ij 滿足條件: a[ij[0, k], ij[1, k]] = data[k]

bsr_matrix((data, indices, indptr), [shape=(M, N)])

data.shape一般是k*R*C,其中R、C分別代表block的行和列長,k代表有幾個小block矩陣;第i行的塊列索引存儲在indices[indptr[i]:indptr[i+1]],其值是data[ indptr[i]: indptr[i+1] ]。

bsr_matrix可用于算術運算:支持加法,減法,乘法,除法和矩陣冪。如下面的例子,對于許多稀疏算術運算,BSR比CSR和CSC更有效:

>>> from scipy.sparse import bsr_matrix>>> import numpy>>> 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)).toarray()array([[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]])

可以通過熱圖觀察矩陣有沒有明顯分塊模式再決定使不使用該方式

bsr matrix對象擁有9個屬性,前四個屬性與coo matrix相同,另外還有以下屬性(注意csr matrix和bsr matrix之間的區別與聯系):

data

即稀疏矩陣的數組,data.shape一般是k*R*C

indices

與屬性data中的k個二維矩陣一一對應,元素值代表在某一行的列號

indptr

bsr各行起始起始值

blocksize

即tuple(R,C)

has_sorted_indices

判斷每一行的indices是否是有序的,返回bool值

實用函數構造特殊稀疏矩陣

scipy.sparse模塊還包含一些便捷函數,用于快速構建單位矩陣、對角矩陣等,下面做一個簡單的匯總:

方法 用途 identity(n[, dtype, format]) 生成稀疏單位矩陣 kron(A, B[, format]) sparse matrices A 和 B的克羅內克積 kronsum(A, B[, format]) sparse matrices A 和 B的克羅內克和 diags(diagonals[, offsets, shape, format, dtype]) 構建稀疏對角陣 spdiags(data, diags, m, n[, format]) 構建稀疏對角陣,同上,但不可指定shape block_diag(mats[, format, dtype]) mats為iterable, 包含多個矩陣,根據mats構建塊對角稀疏矩陣。 tril(A[, k, format]) 以稀疏格式返回矩陣的下三角部分 triu(A[, k, format]) 以稀疏格式返回矩陣的上三角部分 bmat(blocks[, format, dtype]) 從稀疏子塊構建稀疏矩陣 hstack(blocks[, format, dtype]) 水平堆疊稀疏矩陣(column wise) vstack(blocks[, format, dtype]) 垂直堆疊稀疏矩陣 (row wise) rand(m, n[, density, format, dtype, …]) 使用均勻分布的值生成給定形狀和密度的稀疏矩陣 random(m, n[, density, format, dtype, …]) 使用隨機分布的值生成給定形狀和密度的稀疏矩陣 eye(m[, n, k, dtype, format]) 生成稀疏單位對角陣(默認DIAgonal format)

​ scipy.sparse.bmat舉例:

In [1]: A = np.arange(8).reshape(2, 4)In [2]: T = np.tri(5, 4)In [3]: L = [[8] * 4] * 2In [4]: I = sparse.identity(4)In [5]: Z = sparse.coo_matrix((2, 3))In [6]: sp.bmat([[ A, Z, L], ...: [None, None, I], ...: [ T, None, None]], dtype=int)Out[7]:<11x11 sparse matrix of type ’<class ’numpy.int64’>’with 33 stored elements in COOrdinate format>In [8]: _.toarray() # ipython previous outputOut[9]:array([[0, 1, 2, 3, 0, 0, 0, 8, 8, 8, 8], [4, 5, 6, 7, 0, 0, 0, 8, 8, 8, 8], [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]])稀疏矩陣類型判斷

scipy.sparse模塊還包含一些判斷稀疏矩陣類型的函數,這里需要注意的是,issparse() 和 isspmatrix() 是相同的函數,也許是由于歷史原因保留下來了兩個。

isspars(x)isspmatrix(x)isspmatrix_csc(x)isspmatrix_csr(x)isspmatrix_bsr(x)isspmatrix_lil(x)isspmatrix_dok(x)isspmatrix_coo(x)isspmatrix_dia(x)稀疏矩陣存取

load_npz(file) 從.npz文件中讀取稀疏矩陣

save_npz(file, matrix[,compressed]) 將稀疏矩陣寫入.npz文件中

其他

find(A) 返回稀疏矩陣中非零元素的索引以及值

經驗總結

要有效地構造矩陣,請使用dok_matrix或lil_matrix

lil_matrix類支持基本切片和花式索引,其語法與NumPy Array類似;lil_matrix形式是基于row的,因此能夠很高效的轉為csr,但是轉為csc效率相對較低。

強烈建議不要直接使用NumPy函數運算稀疏矩陣

如果你想將NumPy函數應用于這些矩陣,首先要檢查SciPy是否有自己的給定稀疏矩陣類的實現,或者首先將稀疏矩陣轉換為NumPy數組(使用類的toarray()方法)。

要執行乘法或轉置等操作,首先將矩陣轉換為CSC或CSR格式,效率高

CSR格式特別適用于快速矩陣矢量產品

CSR,CSC和COO格式之間的所有轉換都是線性復雜度。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 一区二区久久 | 日本妇丰满乱xxxxⅹ视频 | 国语一级毛片私人影院 | www精品 | 1024亚洲视频 | 日本黄色不卡视频 | 久久久999久久久精品 | 18p爽视频在线观看免费 | 久久毛片免费 | 一区二区在线精品免费视频 | 99ri国产在线观看 | 国产美女做爰免费视 | 99久久精品无码一区二区毛片 | 亚洲国产精品一区二区三区在线观看 | 中文字幕电影在线观看 | 韩国主播19福利视频在线观看 | 国产手机在线国内精品 | 国内自拍区 | 国产欧美精品区一区二区三区 | 婷婷色在线观看 | 免费黄色小视频在线观看 | 亚洲国产日本 | 亚洲精品日韩专区silk | 国产亚洲女在线精品 | 深夜爽爽福利gif在线观看 | 天天色天天碰 | 嫩草影院在线入口 | 亚洲精品一区二区三区四区 | 国产不卡精品一区二区三区 | 久久精品亚洲一级毛片 | 国产激情一区二区三区在线观看 | 精品一区二区三区视频在线观看 | 国产成人精品午夜免费 | 国产大片好看免费播放 | 精品香蕉99久久久久网站 | 国产aaa级一级毛片 国产aaa免费视频国产 | 亚洲精品一区二区深夜福利 | 国产成人aa在线观看视频 | 国产三级理论 | 成年日韩免费大片黄在线观看 | 青青热久免费精品视频在线观看 |