web-dev-qa-db-ja.com

scipy csr_matrix:indptrを理解する

時々、csr_matrixしかし、パラメータindicesindptrがスパース行列を構築するためにどのように連携するかを常に忘れています。

表記csr_matrix((data, indices, indptr), [shape=(M, N)])を使用してスパース行列を定義するときに、indptrdataおよびindicesパラメーターの両方とどのように相互作用するかについて、明確で直感的な説明を探しています。

scipy documentation からわかるように、dataパラメーターにはゼロ以外のすべてのデータが含まれ、indicesパラメーターにはそのデータに関連付けられた列が含まれます(そのため、例ではindicescolと等しいドキュメント内)。しかし、どのようにindptrパラメーターを明確に説明できますか?

14
Tanguy

たぶん、この説明は概念を理解するのに役立つでしょう:

  • dataは、スパース行列のすべての非ゼロ要素を含む配列です。
  • indicesは、dataの各要素をスパース行列の列にマッピングする配列です。
  • indptrは、dataおよびindicesの要素をスパース行列の行にマップします。これは、次の理由で行われます。

    1. スパース行列に[〜#〜] m [〜#〜]行がある場合、indptrを含む配列ですM + 1要素
    2. i[indptr[i]:indptr[i+1]]は、行に対応するdataおよびindicesから取得する要素のインデックスを返しますi。したがって、indptr[i]=kおよびindptr[i+1]=l、行iに対応するデータはdata[k:l]indices[k:l]。これはトリッキーな部分であり、次の例がその理解に役立つことを願っています。

[〜#〜] edit [〜#〜]dataの数字を、次の例で混乱を避けるために文字に置き換えました。

enter image description here

注:indptrの次のセル(次の行)は、その行に対応するindptrおよびdataの次の値を参照しているため、indicesの値は必然的に増加します。

20
Tanguy

確かに、indptr内の要素は昇順です。しかし、indptrの動作を説明する方法は?要するに、indptr内の要素が同じになるか、増加しない限り、スパース行列の行インデックスをスキップできます。

次の例は、indptr要素の上記の解釈を示しています。

例1)このマトリックスを想像してください:

array([[0, 1, 0],
       [8, 0, 0],
       [0, 0, 0],
       [0, 0, 0],
       [0, 0, 7]])


mat1 = csr_matrix(([1,8,7], [1,0,2], [0,1,2,2,2,3]), shape=(5,3))
mat1.indptr
# array([0, 1, 2, 2, 2, 3], dtype=int32)
mat1.todense()  # to get the corresponding sparse matrix

例2)CSR_matrixへの配列(スパース行列が既に存在する場合):

arr = np.array([[0, 0, 0],
                [8, 0, 0],
                [0, 5, 4],
                [0, 0, 0],
                [0, 0, 7]])


mat2 = csr_matrix(arr))
mat2.indptr
# array([0, 0, 1, 3, 3, 4], dtype=int32)
mat2.indices
# array([0, 1, 2, 2], dtype=int32)
mat.data
# array([8, 5, 4, 7], dtype=int32)
1
A. Nadjar