ホームページ  >  記事  >  バックエンド開発  >  スパース ストレージと Python スパース行列の変換の詳細な紹介

スパース ストレージと Python スパース行列の変換の詳細な紹介

黄舟
黄舟オリジナル
2017-05-28 10:56:307572ブラウズ

この記事では、主に Python 疎行列 - スパース ストレージと変換関連の情報を紹介します。必要な方は、

疎行列 - sparsep

from scipy import sparse

The storage form of sparse matrices

In Science and In を参照してください。工学分野では、線形モデルを解くときに多くの大きな行列が頻繁に出現します。これらの行列の要素のほとんどは 0 であり、これは疎行列と呼ばれます。 NumPy の ndarray array を使用してこのような行列を保存すると、大量のメモリが浪費されます。行列のスパースな性質により、非ゼロ要素に関する関連情報のみを保存することでメモリ使用量を節約できます。さらに、この特別な構造を使用して行列の演算 関数を作成すると、行列演算の速度も向上します。 スパース行列を表現するためのさまざまな形式が scipy.sparse ライブラリで提供されており、各形式には異なる用途がありますが、その中で dok_matrix と lil_matrix は要素を段階的に追加するのに適しています。

dok_matrix は、辞書を使用して行列内の 0 ではない要素を保存する dict

から

を継承します。辞書のキーは要素 (行、列) 情報を保存するタプルで、対応する値は要素値の (行, 列) ) の行列。明らかに、辞書形式のスパース行列は、単一要素の追加、削除、およびアクセス操作に非常に適しています。通常は、ゼロ以外の要素を徐々に追加し、高速操作をサポートする他の形式に変換するために使用されます。

a = sparse.dok_matrix((10, 5))
a[2:5, 3] = 1.0, 2.0, 3.0
print a.keys()
print a.values()
[(2, 3), (3, 3), (4, 3)]
[1.0, 2.0, 3.0]
lil_matrix は 2 つのリストを使用して非ゼロ要素を保持します。 data には各行の非ゼロ要素が格納され、rows には非ゼロ要素が配置されている列が格納されます。この形式は、要素を一度に 1 つずつ追加し、行関連のデータを迅速に取得するのにも最適です。

b = sparse.lil_matrix((10, 5))
b[2, 3] = 1.0
b[3, 4] = 2.0
b[3, 2] = 3.0
print b.data
print b.rows
[[] [] [1.0] [3.0, 2.0] [] [] [] [] [] []]
[[] [] [3] [2, 4] [] [] [] [] [] []]

coo_matrix は、row、col、data の 3 つの配列を使用して、ゼロ以外の要素の情報を格納します。 3 つの配列は同じ長さを持ち、row は要素の行を保持し、col は要素の列を保持し、data は要素の値を保持します。 coo_matrix は、要素のアクセス、追加、削除をサポートしていません。一度作成すると、他の形式の行列に変換する以外の操作や行列演算を実行することはほとんど不可能になります。

coo_matrix は繰り返し要素をサポートしています。つまり、同じ行と列の座標が複数回出現する可能性があり、他の形式の行列に変換すると、同じ行と列の座標に対応する複数の値が合計されます。以下の例では、(2, 3) は 1 と 10 の 2 つの値に対応します。 ndarray 配列に変換する場合、これら 2 つの値は加算されるため、(2, 3) の座標の値は最終的な行列は 11 です。

多くの疎行列データはこの形式でファイルに保存されます。たとえば、CSV ファイルには「ユーザー ID、プロダクト ID、評価値」の 3 つの列が含まれる場合があります。 numpy.loadtxt または pandas.read_csv を使用してデータを読み込んだ後、coo_matrix を介してスパース行列にすぐに変換できます。行列の各行はユーザーに対応し、各列は製品に対応し、要素の値はユーザーの評価です。製品の。

row = [2, 3, 3, 2]
col = [3, 4, 2, 3]
data = [1, 2, 3, 10]
c = sparse.coo_matrix((data, (row, col)), shape=(5, 6))
print c.col, c.row, c.data
print c.toarray()
rree

個人的な操作では、疎行列演算を伴うため coo_matrix を選択しましたが、他の形式で保存しないと複雑さが高すぎます (時間と空間)。1000*1000 の行列には約 2 時間かかります。も致命的です。 Pajek ソフトウェアのデータ入力形式のトリプレットを考える以外に選択肢はありませんでした:

そこで、自分のデータを同様のトリプレットに処理することを考えました。

つまり、「行列行列」—>「タプル トリプル」—>「sparseMatrix2tuple」—>「scipy.sparse」

以上がスパース ストレージと Python スパース行列の変換の詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。