2.5.2.2.3. 辞書キー格納方式 (DOK)

  • Python 辞書のサブクラス
    • キーは (row, column) のインデックスタプルです (要素は重複してはいけません)

    • 辞書の値は非ゼロ要素の値に対応します

  • 疎行列を効率的にインクリメンタルに構築できます

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

    • 疎行列

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

  • 個々の要素への 高速 なアクセス O(1)

  • 柔軟なスライスと疎行列の構造の効率的な変更

  • 一度構築されれば coo_matrix に効率的に変換できます

  • 算術は低速です (dict.iteritems() に対する for ループ)

  • 利用:
    • 疎パターンが事前にわかっていない、または変更される場合

2.5.2.2.3.1. 例

  • DOK 行列を要素毎に代入して作成:

    >>> mtx = sparse.dok_matrix((5, 5), dtype=np.float64)
    
    >>> mtx
    <5x5 sparse matrix of type '<... 'numpy.float64'>'
    with 0 stored elements in Dictionary Of Keys format>
    >>> for ir in range(5):
    ... for ic in range(5):
    ... mtx[ir, ic] = 1.0 * (ir != ic)
    >>> mtx
    <5x5 sparse matrix of type '<... 'numpy.float64'>'
    with 20 stored elements in Dictionary Of Keys format>
    >>> mtx.todense()
    matrix([[ 0., 1., 1., 1., 1.],
    [ 1., 0., 1., 1., 1.],
    [ 1., 1., 0., 1., 1.],
    [ 1., 1., 1., 0., 1.],
    [ 1., 1., 1., 1., 0.]])
  • スライスとインデクス:

    >>> mtx[1, 1]
    
    0.0
    >>> mtx[1, 1:3]
    <1x2 sparse matrix of type '<... 'numpy.float64'>'
    with 1 stored elements in Dictionary Of Keys format>
    >>> mtx[1, 1:3].todense()
    matrix([[ 0., 1.]])
    >>> mtx[[2,1], 1:3].todense()
    matrix([[ 1., 0.],
    [ 0., 1.]])