SciPy疎行列

疎行列(英語: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
Share

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です