2.5.2.2.6. 圧縮列格納方式 (CSC)

  • 列指向
    • 3つの NumPy 配列: indices, indptr, data
      • indices は行インデクスの配列

      • data は非ゼロの値に対応する配列

      • indptrindicesdata の中の列の始まりを示します

      • n_col + 1 は長さで、最後の要素 = 値の数 = ``indices` と data の両者の長さ

      • i-番目の列の非ゼロの値は列インデクス indices[indptr[i]:indptr[i+1]] を使って data[indptr[i]:indptr[i+1]] になります。

      • 要素 (i, j)data[indptr[j]+k] としてアクセスすることができ、ここで kindices[indptr[j]:indptr[j+1]] の中の i の位置です。

    • _cs_matrix (CSR/CSC 共通の機能を持つ) の派生クラス
      • _data_matrix (.data 属性を持つ疎行列) の派生クラス

  • 行列ベクトル積と他の算術演算が高速です (sparsetools)

  • コンストラクタは以下を受け付けます:
    • 密行列(配列)

    • 疎行列

    • シェイプタプル (空の行列を作ります)

    • (data, ij) タプル

    • (data, indices, indptr) タプル

  • 効率的な列スライス、列指向演算

  • 行スライスは低速で疎行列構造の変更は高くつきます

  • 利用:
    • 実際の計算 (多くの線形代数ソルバーはこの形式をサポートします)

2.5.2.2.6.1. 例

  • 空の CSC 行列を作る:

    >>> mtx = sparse.csc_matrix((3, 4), dtype=np.int8)
    
    >>> mtx.todense()
    matrix([[0, 0, 0, 0],
    [0, 0, 0, 0],
    [0, 0, 0, 0]], dtype=int8)
  • (data, ij) タプルを利用して作る:

    >>> row = np.array([0, 0, 1, 2, 2, 2])
    
    >>> col = np.array([0, 2, 2, 0, 1, 2])
    >>> data = np.array([1, 2, 3, 4, 5, 6])
    >>> mtx = sparse.csc_matrix((data, (row, col)), shape=(3, 3))
    >>> mtx
    <3x3 sparse matrix of type '<... 'numpy.int64'>'
    with 6 stored elements in Compressed Sparse Column format>
    >>> mtx.todense()
    matrix([[1, 0, 2],
    [0, 0, 3],
    [4, 5, 6]]...)
    >>> mtx.data
    array([1, 4, 5, 2, 3, 6]...)
    >>> mtx.indices
    array([0, 2, 2, 0, 1, 2], dtype=int32)
    >>> mtx.indptr
    array([0, 2, 3, 6], dtype=int32)
  • (data, indices, indptr) タプルを利用して作る:

    >>> data = np.array([1, 4, 5, 2, 3, 6])
    
    >>> indices = np.array([0, 2, 2, 0, 1, 2])
    >>> indptr = np.array([0, 2, 3, 6])
    >>> mtx = sparse.csc_matrix((data, indices, indptr), shape=(3, 3))
    >>> mtx.todense()
    matrix([[1, 0, 2],
    [0, 0, 3],
    [4, 5, 6]])