如何在Python中創建稀疏矩陣?
在機器學習、數據挖掘等領域,我們經常會面對大量的數據,許多時候,這些數據都可以用矩陣的形式表示。愛掏網 - it200.com但是,如果矩陣中有大量的零元素,這樣會占用大量的內存空間,極大地影響計算效率。愛掏網 - it200.com稀疏矩陣的出現可以彌補這個問題,它們只存儲非零元素,可以節省大量的內存空間。愛掏網 - it200.com本文將介紹如何在Python中創建稀疏矩陣。愛掏網 - it200.com
稀疏矩陣可以用多種方式表示,常用的有三個方法:坐標列表(COO)、壓縮稀疏行(CSR)、壓縮稀疏列(CSC)。愛掏網 - it200.com我們將對它們逐一進行介紹。愛掏網 - it200.com
坐標列表(COO)
坐標列表(COO)是最簡單的一種表示方法,它保存矩陣中所有非零元素的行標、列標及對應的值。愛掏網 - it200.com例如,下面是一個 3 \times 3 的矩陣:
\begin{bmatrix}
0&0&5 \
0&2&0 \
1&0&4
\end{bmatrix}
用坐標列表表示,則為:
import numpy as np
data = np.array([5, 2, 1, 4])
row = np.array([0, 1, 2, 2])
col = np.array([2, 1, 0, 2])
其中,data
表示非零元素的值,row
表示非零元素的行標,col
表示非零元素的列標。愛掏網 - it200.com在 COO 中,每個非零元素都需要存儲行標、列標及對應的值,因此它不適用于稠密矩陣。愛掏網 - it200.com
壓縮稀疏行(CSR)
壓縮稀疏行(CSR)是一種常用的表示方法,它只存儲每行第一個非零元素的位置及非零元素的值,最后在行指針(Row Pointer)中記錄每一行第一個非零元素的位置。愛掏網 - it200.com例如,同樣是那個 3 \times 3 的矩陣:
\begin{bmatrix}
0&0&5 \
0&2&0 \
1&0&4
\end{bmatrix}
用壓縮稀疏行表示,則為:
import numpy as np
data = np.array([5, 2, 1, 4])
indices = np.array([2, 1, 0, 2])
indptr = np.array([0, 1, 2, 4])
其中,data
表示非零元素的值,indices
表示每個非零元素的列標,indptr
表示每行第一個非零元素在 data
和 indices
中的位置。愛掏網 - it200.com在首尾多一個位置,在處理非常規矩陣時比較方便。愛掏網 - it200.com
壓縮稀疏列(CSC)
壓縮稀疏列(CSC)與壓縮稀疏行類似,只不過它是按列存儲非零元素,數據、行指針和列指針分別保存了矩陣中每個非零元素的值、行標和所在列的第一個非零元素的位置。愛掏網 - it200.com例如,同樣是那個 3 \times 3 的矩陣:
用壓縮稀疏列表示,則為:
import numpy as np
data = np.array([1, 5, 2, 4])
indices = np.array([2, 0, 1, 2])
indptr = np.array([0, 1, 2, 4])
其中,data
表示非零元素的值,indices
表示每個非零元素的行標,indptr
表示每列第一個非零元素在 data
和 indices
中的位置。愛掏網 - it200.com
創建稀疏矩陣的方法
現在,我們來具體介紹如何在Python中創建稀疏矩陣。愛掏網 - it200.com在 Python 中,我們常使用 SciPy 庫來操作稀疏矩陣,它提供了許多函數用于創建、轉換和計算稀疏矩陣。愛掏網 - it200.com
創建 COO 稀疏矩陣
我們可以使用 scipy.sparse.coo_matrix
函數來創建 COO 稀疏矩陣。愛掏網 - it200.com該函數的參數包括非零元素的值、行標和列標。愛掏網 - it200.com例如,創建一個 5 \times 5 的 COO 稀疏矩陣: