疎行列(英語:sparse matrix)は、数値解析でほとんどの値がゼロである行列を指します。逆に、ほとんどの要素がゼロ以外の場合、行列は密(Dense)です。
科学や工学の分野で線形モデルを解く場合、大きな疎行列がよく見えます。
上記の左側の図は疎行列であり、多くの0要素が含まれていることがわかります。右側の図は密行列であり、ほとんどの要素は0ではありません。
次には実例を挙げます。
上記の疎行列には、9つの非ゼロ要素と26のゼロ要素のみが含まれています。 その疎度は74%で、密度は26%です。
SciPyのscipy.sparseモジュールは、疎行列を処理するための関数を提供します。
主に次の2種類の疎行列を使用します。
- CSC – 圧縮列格納方式。列ごとに圧縮されます。
- CSR – 圧縮行格納方式。行ごとに圧縮されます。
この章では、主にCSR行列を使用します。
CSR行列
配列をscipy.sparse.csr_matrix()関数に渡すことによって、CSR行列を作成できます。
実例
CSR行列を作成します。
import numpy as np
from scipy.sparse import csr_matrix
arr = np.array([0, 0, 0, 0, 0, 1, 1, 0, 2])
print(csr_matrix(arr))
上記のコードを実行した後、出力結果は次のとおりです。
(0, 5) 1
(0, 6) 1
(0, 8) 2
結果の分析:
- 1行目:行列の1行目(インデックス値は0)、6番目の位置(インデックス値は5)に値1があります。
- 2行目:行列の1行目(インデックス値は0)、7番目の位置(インデックス値は6)に値1があります。
- 3行目:行列の1行目(インデックス値は0)、9番目の位置(インデックス値は8)に値2があります。
CSR行列のメソッド
data属性を使用して、保存されているデータ(0要素なし)を表示できます。
実例
import numpy as np
from scipy.sparse import csr_matrix
arr = np.array([[0, 0, 0], [0, 0, 1], [1, 0, 2]])
print(csr_matrix(arr).data)
上記のコードを実行した後、出力結果は次のとおりです。
[1 1 2]
count_nonzero()メソッドを使用して、ゼロ以外の要素の個数を計算します。
実例
import numpy as np
from scipy.sparse import csr_matrix
arr = np.array([[0, 0, 0], [0, 0, 1], [1, 0, 2]])
print(csr_matrix(arr).count_nonzero())
上記のコードを実行した後、出力結果は次のとおりです。
3
remove_zeros()メソッドを使用して、行列内の0要素を削除します。
実例
import numpy as np
from scipy.sparse import csr_matrix
arr = np.array([[0, 0, 0], [0, 0, 1], [1, 0, 2]])
mat = csr_matrix(arr)
mat.eliminate_zeros()
print(mat)
上記のコードを実行した後、出力結果は次のとおりです。
(1, 2) 1
(2, 0) 1
(2, 2) 2
sum_duplicates() メソッドを使用して、重複を削除します。
実例
import numpy as np
from scipy.sparse import csr_matrix
arr = np.array([[0, 0, 0], [0, 0, 1], [1, 0, 2]])
mat = csr_matrix(arr)
mat.sum_duplicates()
print(mat)
上記のコードを実行した後、出力結果は次のとおりです。
(1, 2) 1
(2, 0) 1
(2, 2) 2
tocsc()メソッドを使用して、csrをcscに変換します。
実例
import numpy as np
from scipy.sparse import csr_matrix
arr = np.array([[0, 0, 0], [0, 0, 1], [1, 0, 2]])
newarr = csr_matrix(arr).tocsc()
print(newarr)
(2, 0) 1
(1, 2) 1
(2, 2) 2
コメントを残す