時々、csr_matrix
しかし、パラメータindices
とindptr
がスパース行列を構築するためにどのように連携するかを常に忘れています。
表記csr_matrix((data, indices, indptr), [shape=(M, N)])
を使用してスパース行列を定義するときに、indptr
がdata
およびindices
パラメーターの両方とどのように相互作用するかについて、明確で直感的な説明を探しています。
scipy documentation からわかるように、data
パラメーターにはゼロ以外のすべてのデータが含まれ、indices
パラメーターにはそのデータに関連付けられた列が含まれます(そのため、例ではindices
はcol
と等しいドキュメント内)。しかし、どのようにindptr
パラメーターを明確に説明できますか?
たぶん、この説明は概念を理解するのに役立つでしょう:
data
は、スパース行列のすべての非ゼロ要素を含む配列です。indices
は、data
の各要素をスパース行列の列にマッピングする配列です。indptr
は、data
およびindices
の要素をスパース行列の行にマップします。これは、次の理由で行われます。
indptr
はを含む配列ですM + 1要素[indptr[i]:indptr[i+1]]
は、行に対応するdata
およびindices
から取得する要素のインデックスを返しますi。したがって、indptr[i]=k
およびindptr[i+1]=l
、行iに対応するデータはdata[k:l]
列indices[k:l]
。これはトリッキーな部分であり、次の例がその理解に役立つことを願っています。[〜#〜] edit [〜#〜]:data
の数字を、次の例で混乱を避けるために文字に置き換えました。
注:indptr
の次のセル(次の行)は、その行に対応するindptr
およびdata
の次の値を参照しているため、indices
の値は必然的に増加します。
確かに、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)