日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python scipy 稀疏矩阵详解

發布時間:2024/1/23 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python scipy 稀疏矩阵详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 稀疏矩陣格式
      • coo_matrix
      • csr_matrix
      • csc_matrix
      • lil_matrix
      • dok_matrix
      • dia_matrix
      • bsr_matrix
  • 實用函數
  • 經驗總結
  • 參考

稀疏矩陣格式

coo_matrix

??coo_matrix是最簡單的稀疏矩陣存儲方式,采用三元組(row, col, data)(或稱為ijv format)的形式來存儲矩陣中非零元素的信息。在實際使用中,一般coo_matrix用來創建矩陣,因為coo_matrix無法對矩陣的元素進行增刪改操作;創建成功之后可以轉化成其他格式的稀疏矩陣(如csr_matrix、csc_matrix)進行轉置、矩陣乘法等操作。

? 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個元素值為非零,數據類型為整形。

? 下面給出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中的元素一一對應。

? 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組成,如下圖所示:

? 其實例化方式、屬性、方法、優缺點和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的空矩陣。

? 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,主對角線)。該格式的稀疏矩陣可用于算術運算:它們支持加法,減法,乘法,除法和矩陣冪。

? 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 output Out[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格式之間的所有轉換都是線性復雜度。

參考

matteding
scipy sparse

總結

以上是生活随笔為你收集整理的python scipy 稀疏矩阵详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。