稀疏陣列 (scipy.sparse)#

SciPy 用於數值資料的 2-D 稀疏陣列套件。

注意

此套件正在從舊的矩陣介面切換到與 NumPy 陣列相容的陣列介面。我們建議您將陣列物件(bsr_arraycoo_array 等)用於所有新工作。

使用陣列介面時,請注意

  • x * y 不再執行矩陣乘法,而是逐元素乘法(就像 NumPy 陣列一樣)。為了使程式碼同時適用於陣列和矩陣,請使用 x @ y 進行矩陣乘法。

  • 諸如 sum 之類的操作,過去會產生密集矩陣,現在會產生陣列,它們的乘法行為也類似地不同。

  • 稀疏陣列使用陣列樣式的切片操作,傳回純量、1D 或 2D 稀疏陣列。如果您需要 2D 結果,請使用適當的索引。例如 A[:, i, None]A[:, [i]]

建構公用程式(eyekronrandomdiags 等)具有適當的替代品(請參閱建置稀疏陣列)。

如需更多資訊,請參閱從 spmatrix 遷移到 sparray

子模組#

csgraph

壓縮稀疏圖例程 (scipy.sparse.csgraph)

linalg

稀疏線性代數 (scipy.sparse.linalg)

稀疏陣列類別#

bsr_array(arg1[, shape, dtype, copy, ...])

區塊稀疏列格式稀疏陣列。

coo_array(arg1[, shape, dtype, copy, maxprint])

COOrdinate 格式的稀疏陣列。

csc_array(arg1[, shape, dtype, copy, maxprint])

壓縮稀疏行陣列。

csr_array(arg1[, shape, dtype, copy, maxprint])

壓縮稀疏列陣列。

dia_array(arg1[, shape, dtype, copy, maxprint])

具有 DIAgonal 儲存體的稀疏陣列。

dok_array(arg1[, shape, dtype, copy, maxprint])

基於 Dictionary Of Keys 的稀疏陣列。

lil_array(arg1[, shape, dtype, copy, maxprint])

基於列的 LIst of Lists 稀疏陣列。

sparray()

此類別為所有稀疏陣列提供基底類別。

建置稀疏陣列#

diags_array(diagonals, /, *[, offsets, ...])

從對角線建構稀疏陣列。

eye_array(m[, n, k, dtype, format])

稀疏陣列格式的單位矩陣

random_array(shape, *[, density, format, ...])

傳回 [0, 1) 中均勻隨機數的稀疏陣列

block_array(blocks, *[, format, dtype])

從稀疏子區塊建置稀疏陣列

組合陣列#

kron(A, B[, format])

稀疏矩陣 A 和 B 的 kronecker 乘積

kronsum(A, B[, format])

方陣稀疏矩陣 A 和 B 的 kronecker 和

block_diag(mats[, format, dtype])

從提供的矩陣建置區塊對角稀疏矩陣或陣列。

tril(A[, k, format])

傳回稀疏陣列或矩陣的下三角部分

triu(A[, k, format])

傳回稀疏陣列或矩陣的上三角部分

hstack(blocks[, format, dtype])

水平堆疊稀疏矩陣(按列排列)

vstack(blocks[, format, dtype])

垂直堆疊稀疏陣列(按列排列)

稀疏工具#

save_npz(file, matrix[, compressed])

使用 .npz 格式將稀疏矩陣或陣列儲存到檔案。

load_npz(file)

使用 .npz 格式從檔案載入稀疏陣列/矩陣。

find(A)

傳回矩陣非零元素的索引和值

get_index_dtype([arrays, maxval, check_contents])

根據輸入(整數)陣列 a,判斷適合用於保存陣列中資料的索引資料類型。

safely_cast_index_arrays(A[, idx_dtype, msg])

安全地將稀疏陣列索引轉換為 idx_dtype

識別稀疏陣列#

issparse(x)

x 是否為稀疏陣列或稀疏矩陣類型?

稀疏矩陣類別#

bsr_matrix(arg1[, shape, dtype, copy, ...])

區塊稀疏列格式稀疏矩陣。

coo_matrix(arg1[, shape, dtype, copy, maxprint])

COOrdinate 格式的稀疏矩陣。

csc_matrix(arg1[, shape, dtype, copy, maxprint])

壓縮稀疏行矩陣。

csr_matrix(arg1[, shape, dtype, copy, maxprint])

壓縮稀疏列矩陣。

dia_matrix(arg1[, shape, dtype, copy, maxprint])

具有 DIAgonal 儲存體的稀疏矩陣。

dok_matrix(arg1[, shape, dtype, copy, maxprint])

基於 Dictionary Of Keys 的稀疏矩陣。

lil_matrix(arg1[, shape, dtype, copy, maxprint])

基於列的 LIst of Lists 稀疏矩陣。

spmatrix()

此類別為所有稀疏矩陣類別提供基底類別。

建置稀疏矩陣#

eye(m[, n, k, dtype, format])

對角線上為 1 的稀疏矩陣

identity(n[, dtype, format])

稀疏格式的單位矩陣

diags(diagonals[, offsets, shape, format, dtype])

從對角線建構稀疏矩陣。

spdiags(data, diags[, m, n, format])

從對角線傳回稀疏矩陣。

bmat(blocks[, format, dtype])

從稀疏子區塊建置稀疏陣列或矩陣

random(m, n[, density, format, dtype, rng, ...])

產生具有給定形狀和密度的稀疏矩陣,其中值隨機分佈。

rand(m, n[, density, format, dtype, rng])

產生具有給定形狀和密度的稀疏矩陣,其中值均勻分佈。

組合矩陣使用與 組合陣列 相同的功能。

識別稀疏矩陣#

issparse(x)

x 是否為稀疏陣列或稀疏矩陣類型?

isspmatrix(x)

x 是否為稀疏矩陣類型?

isspmatrix_csc(x)

x 是否為 csc_matrix 類型?

isspmatrix_csr(x)

x 是否為 csr_matrix 類型?

isspmatrix_bsr(x)

x 是否為 bsr_matrix 類型?

isspmatrix_lil(x)

x 是否為 lil_matrix 類型?

isspmatrix_dok(x)

x 是否為 dok_array 類型?

isspmatrix_coo(x)

x 是否為 coo_matrix 類型?

isspmatrix_dia(x)

x 是否為 dia_matrix 類型?

警告#

SparseEfficiencyWarning

SparseWarning

使用資訊#

有七種可用的稀疏陣列類型

  1. csc_array:壓縮稀疏行格式

  2. csr_array:壓縮稀疏列格式

  3. bsr_array:區塊稀疏列格式

  4. lil_array:List of Lists 格式

  5. dok_array:Dictionary of Keys 格式

  6. coo_array:COOrdinate 格式(又名 IJV、三元組格式)

  7. dia_array:DIAgonal 格式

若要有效率地建構陣列,請使用 coo_arraydok_arraylil_array 中的任何一種。dok_arraylil_array 支援基本切片和花式索引,其語法與 NumPy 陣列類似。COO 格式尚不支援索引,但也可以用於使用坐標和值資訊有效率地建構陣列。

儘管它們與 NumPy 陣列相似,但強烈建議不要直接在這些陣列上使用 NumPy 函數,因為 NumPy 通常將它們視為通用的 Python 物件,而不是陣列,從而導致意外(且不正確)的結果。如果您確實想將 NumPy 函數應用於這些陣列,請先檢查 SciPy 是否有針對給定稀疏陣列類別的自有實作,或者在應用該方法之前,將稀疏陣列轉換為 NumPy 陣列(例如,使用該類別的 toarray 方法)。

CSR、CSC 和 COO 格式之間的所有轉換都是有效率的線性時間運算。

若要執行乘法或反轉等操作,請先將陣列轉換為 CSC 或 CSR 格式。lil_array 格式是以列為基礎的,因此轉換為 CSR 格式是有效率的,而轉換為 CSC 格式則效率較低。

矩陣向量乘積#

若要在 2D 稀疏陣列和向量之間執行向量乘積,請使用 matmul 運算子(即 @),它會執行點積(如 dot 方法)

>>> import numpy as np
>>> from scipy.sparse import csr_array
>>> A = csr_array([[1, 2, 0], [0, 0, 3], [4, 0, 5]])
>>> v = np.array([1, 0, -1])
>>> A @ v
array([ 1, -3, -1], dtype=int64)

CSR 格式特別適合用於快速矩陣向量乘積。

範例 1#

建構 1000x1000 lil_array 並向其新增一些值

>>> from scipy.sparse import lil_array
>>> from scipy.sparse.linalg import spsolve
>>> from numpy.linalg import solve, norm
>>> from numpy.random import rand
>>> A = lil_array((1000, 1000))
>>> A[0, :100] = rand(100)
>>> A.setdiag(rand(1000))

現在將其轉換為 CSR 格式並求解 A x = b 以求 x

>>> A = A.tocsr()
>>> b = rand(1000)
>>> x = spsolve(A, b)

將其轉換為密集陣列並求解,並檢查結果是否相同

>>> x_ = solve(A.toarray(), b)

現在我們可以使用以下方法計算誤差的範數

>>> err = norm(x-x_)
>>> err < 1e-10
True

它應該很小 :)

範例 2#

以 COO 格式建構陣列

>>> from scipy import sparse
>>> from numpy import array
>>> I = array([0,3,1,0])
>>> J = array([0,3,1,2])
>>> V = array([4,5,7,9])
>>> A = sparse.coo_array((V,(I,J)),shape=(4,4))

請注意,索引不需要排序。

在轉換為 CSR 或 CSC 時,重複的 (i,j) 項目會被加總。

>>> I = array([0,0,1,3,1,0,0])
>>> J = array([0,2,1,3,1,0,0])
>>> V = array([1,1,1,1,1,1,1])
>>> B = sparse.coo_array((V,(I,J)),shape=(4,4)).tocsr()

這對於建構有限元素剛度和質量矩陣很有用。

更多詳細資訊#

CSR 行索引不一定排序。CSC 列索引也是如此。當需要排序的索引時(例如,當將資料傳遞到其他程式庫時),請使用 .sorted_indices().sort_indices() 方法。