11

との違いがよくわかりませcoo_matrixん。csr_matrixcsc_matrix

ドキュメントには、 coo_matrix は算術演算には効率的ではないため、csrorに変換する必要があることが記載されていcscます。行列の乗算について詳しく調べています。そして、単に を持っていて、それをまたはマトリックスcoo_matrixに変換すると、舞台裏で何が起こっているのか理解できませんでした。csrcsv

また、次のようなものがある場合

A = array([[1,2,3,0,0,5],
        [5,0,0,1,2,0]])
print coo_matrix(A)

印刷します

  (0, 0)    1
  (0, 1)    2
  (0, 2)    3
  (0, 5)    5

これはクールです。しかし、方法はありますか、印刷されたものとしてマトリックスを直接入力できます。coo_matrixヌル COO 行列を定義してから、matlab で行うのと同じように値の定義を開始するようなものです。

ありがとう!

4

4 に答える 4

7

用語はpython scipyによって発明されたものではありませんが、疎行列表現科学にはすでに存在していました

スパース行列を表現できるさまざまな形式が存在します。
フォーマットは次の 2 つのグループに分けられます。

  1. DOK (キーの辞書)、LIL (リストのリスト)、COO (座標リスト) などの効率的な変更をサポートするもの。これらは通常、マトリックスの作成に使用されます。
  2. CSR (Compressed Sparse Row) や CSC (Compressed Sparse Column) などの効率的なアクセスと行列演算をサポートするもの。

コーディネート一覧(COO)

COOは (行、列、値) タプルのリストを格納します。ランダム アクセス時間を改善するために、エントリを (行インデックス、列インデックスの順に) 並べ替えるのが理想的です。これは、インクリメンタル マトリックスの構築に適した別の形式です。

圧縮疎行 (CSR)

圧縮スパース行 (CSR) または圧縮行ストレージ (CRS) 形式は、行列 M を 3 つの (1 次元) 配列で表し、それぞれ非ゼロ値、行の範囲、および列インデックスを含みます。この形式により、高速な行アクセスと行列とベクトルの乗算が可能になります。

CSR 形式は、3 つの (1 次元) 配列 (A、IA、JA) を使用して、スパースな m × n 行列 M を行形式で格納します。NNZ が M の非ゼロ エントリの数を表すとします (ここではゼロ ベースのインデックスが使用されることに注意してください)。

配列 A の長さは NNZ で、M のすべての非ゼロ エントリを左から右、上から下 (「行優先」) の順序で保持します。

  1. 配列 IA の長さは m + 1 です。次の再帰的定義によって定義されます。
    IA[0] = 0
    IA[i] = IA[i − 1] + ((i − 1) 番目の非ゼロ要素の数元の行列の行)

したがって、IA の最初の m 要素は、M の各行の最初の非ゼロ要素の A へのインデックスを格納し、最後の要素 IA[m] は、A の要素数である NNZ を格納します。行列 M
の終わりのすぐ後ろにあるファントム行の最初の要素の A のインデックス。元の行列の i 番目の行の値は、要素 A[IA[i]] から A[IA[i + 1] − 1] (両端を含む)、つまり、1 つの行の開始点から次の開始点の直前の最後のインデックスまで。

3 番目の配列 JA には、A の各要素の M の列インデックスが含まれているため、長さも NNZ です。

たとえば、行列 0 0 0 0
5 8 0 0
0 0 3 0
0 6 0 0

は 4 つの非ゼロ要素をもつ 4 × 4 行列であるため、

A = [ 5 8 3 6 ]
IA = [ 0 0 2 3 4 ]
JA = [ 0 1 2 1 ]

ソース: https://en.wikipedia.org/wiki/Sparse_matrix

于 2016-10-02T05:07:33.587 に答える
1

スパース行列には、ほとんどゼロが含まれています。coo_matrixcsr_matrixおよびcsc_matrixはすべてスパース行列クラスです。coo_matrix行、列、値のリストです。このタイプのスパース行列は、多くのゼロを含む大きな行列がある場合、実際にはそれらすべてのゼロに対して数学を実行したくないため、算術演算には非効率的です。スパース行列のゼロ以外の値に対して計算を実行したいだけです。csr_matrixおよびcsc_matrixは、この問題の解決策です。スパース行列のすべての値を一覧表示する代わりに、実際csrcscは、ゼロ以外の値、列インデックス、およびcsrゼロ以外の値がスパース内のどこにあるかを示す行ポインター(の)を持つ3つの1-D行列です。マトリックス。教科書を書き直したくないので、ここに詳細と例を示します。

2番目の質問に答えます。使用したいscipy.sparse.dok_matrix。これは、キーベースのスパース行列の辞書です。これをMATLABスタイルで編集してから、算術演算に変換しcsrたりcsc、算術演算用に変換したりできます。動的に編集する簡単な例を次に示します。

>>> A = scipy.sparse.dok_matrix((5,5))
>>> A[2,3] = 7
>>> print A
  (2, 3)      7.0
于 2012-06-27T02:52:09.367 に答える
0

私はあなたがこのようなものを探していると思います:

row  = np.array([0,0,0,0])
col  = np.array([0,1,2,5])
data = np.array([1,2,3,5])
coo_matrix((data,(row,col))).todense()

これにより、次のことが得られます。

matrix([[1, 2, 3, 0, 0, 5]])

scipy ドキュメントへのリンクは次のとおりです

于 2013-07-13T19:26:08.527 に答える