稀疏陣列 (scipy.sparse
)#
SciPy 用於數值資料的 2-D 稀疏陣列套件。
注意
此套件正在從舊的矩陣介面切換到與 NumPy 陣列相容的陣列介面。我們建議您將陣列物件(bsr_array
、coo_array
等)用於所有新工作。
使用陣列介面時,請注意
x * y
不再執行矩陣乘法,而是逐元素乘法(就像 NumPy 陣列一樣)。為了使程式碼同時適用於陣列和矩陣,請使用x @ y
進行矩陣乘法。諸如
sum
之類的操作,過去會產生密集矩陣,現在會產生陣列,它們的乘法行為也類似地不同。稀疏陣列使用陣列樣式的切片操作,傳回純量、1D 或 2D 稀疏陣列。如果您需要 2D 結果,請使用適當的索引。例如
A[:, i, None]
或A[:, [i]]
。
建構公用程式(eye
、kron
、random
、diags
等)具有適當的替代品(請參閱建置稀疏陣列)。
如需更多資訊,請參閱從 spmatrix 遷移到 sparray。
子模組#
壓縮稀疏圖例程 (scipy.sparse.csgraph) |
|
稀疏線性代數 (scipy.sparse.linalg) |
稀疏陣列類別#
|
區塊稀疏列格式稀疏陣列。 |
|
COOrdinate 格式的稀疏陣列。 |
|
壓縮稀疏行陣列。 |
|
壓縮稀疏列陣列。 |
|
具有 DIAgonal 儲存體的稀疏陣列。 |
|
基於 Dictionary Of Keys 的稀疏陣列。 |
|
基於列的 LIst of Lists 稀疏陣列。 |
|
此類別為所有稀疏陣列提供基底類別。 |
建置稀疏陣列#
|
從對角線建構稀疏陣列。 |
|
稀疏陣列格式的單位矩陣 |
|
傳回 [0, 1) 中均勻隨機數的稀疏陣列 |
|
從稀疏子區塊建置稀疏陣列 |
組合陣列#
|
稀疏矩陣 A 和 B 的 kronecker 乘積 |
|
方陣稀疏矩陣 A 和 B 的 kronecker 和 |
|
從提供的矩陣建置區塊對角稀疏矩陣或陣列。 |
|
傳回稀疏陣列或矩陣的下三角部分 |
|
傳回稀疏陣列或矩陣的上三角部分 |
|
水平堆疊稀疏矩陣(按列排列) |
|
垂直堆疊稀疏陣列(按列排列) |
稀疏工具#
|
使用 |
|
使用 |
|
傳回矩陣非零元素的索引和值 |
|
根據輸入(整數)陣列 a,判斷適合用於保存陣列中資料的索引資料類型。 |
|
安全地將稀疏陣列索引轉換為 idx_dtype。 |
識別稀疏陣列#
|
x 是否為稀疏陣列或稀疏矩陣類型? |
稀疏矩陣類別#
|
區塊稀疏列格式稀疏矩陣。 |
|
COOrdinate 格式的稀疏矩陣。 |
|
壓縮稀疏行矩陣。 |
|
壓縮稀疏列矩陣。 |
|
具有 DIAgonal 儲存體的稀疏矩陣。 |
|
基於 Dictionary Of Keys 的稀疏矩陣。 |
|
基於列的 LIst of Lists 稀疏矩陣。 |
|
此類別為所有稀疏矩陣類別提供基底類別。 |
建置稀疏矩陣#
|
對角線上為 1 的稀疏矩陣 |
|
稀疏格式的單位矩陣 |
|
從對角線建構稀疏矩陣。 |
|
從對角線傳回稀疏矩陣。 |
|
從稀疏子區塊建置稀疏陣列或矩陣 |
|
產生具有給定形狀和密度的稀疏矩陣,其中值隨機分佈。 |
|
產生具有給定形狀和密度的稀疏矩陣,其中值均勻分佈。 |
組合矩陣使用與 組合陣列 相同的功能。
識別稀疏矩陣#
|
x 是否為稀疏陣列或稀疏矩陣類型? |
|
x 是否為稀疏矩陣類型? |
x 是否為 csc_matrix 類型? |
|
x 是否為 csr_matrix 類型? |
|
x 是否為 bsr_matrix 類型? |
|
x 是否為 lil_matrix 類型? |
|
x 是否為 dok_array 類型? |
|
x 是否為 coo_matrix 類型? |
|
x 是否為 dia_matrix 類型? |
警告#
使用資訊#
有七種可用的稀疏陣列類型
csc_array:壓縮稀疏行格式
csr_array:壓縮稀疏列格式
bsr_array:區塊稀疏列格式
lil_array:List of Lists 格式
dok_array:Dictionary of Keys 格式
coo_array:COOrdinate 格式(又名 IJV、三元組格式)
dia_array:DIAgonal 格式
若要有效率地建構陣列,請使用 coo_array
、dok_array
或 lil_array
中的任何一種。dok_array
和 lil_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()
方法。