2.5.2.2.2. リストのリスト格納方式 (LIL)

  • 行ベースの連結リスト
    • 各行は (ソートされた) Python のリストで、非ゼロの要素の列のインデックスを含みます

    • 行は NumPy 配列で格納されます (dtype=np.object)

    • 非ゼロの値が同様に格納されます

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

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

    • 疎行列

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

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

  • 算術が低速で、行ベースなため列スライスが低速です

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

    • 例: 疎行列をテキストファイルから読み込む

2.5.2.2.2.1. 例

  • 空の LIL 行列を作る:

    >>> mtx = sparse.lil_matrix((4, 5))
    
  • ランダムなデータを準備:

    >>> from numpy.random import rand
    
    >>> data = np.round(rand(2, 3))
    >>> data
    array([[ 1., 1., 1.],
    [ 1., 0., 1.]])
  • ファンシーインデクスを利用した値の代入:

    >>> mtx[:2, [1, 2, 3]] = data
    
    >>> mtx
    <4x5 sparse matrix of type '<... 'numpy.float64'>'
    with 5 stored elements in LInked List format>
    >>> print(mtx)
    (0, 1) 1.0
    (0, 2) 1.0
    (0, 3) 1.0
    (1, 1) 1.0
    (1, 3) 1.0
    >>> mtx.todense()
    matrix([[ 0., 1., 1., 1., 0.],
    [ 0., 1., 0., 1., 0.],
    [ 0., 0., 0., 0., 0.],
    [ 0., 0., 0., 0., 0.]])
    >>> mtx.toarray()
    array([[ 0., 1., 1., 1., 0.],
    [ 0., 1., 0., 1., 0.],
    [ 0., 0., 0., 0., 0.],
    [ 0., 0., 0., 0., 0.]])
  • スライスとインデクスについてもう少し:

    >>> mtx = sparse.lil_matrix([[0, 1, 2, 0], [3, 0, 1, 0], [1, 0, 0, 1]])
    
    >>> mtx.todense()
    matrix([[0, 1, 2, 0],
    [3, 0, 1, 0],
    [1, 0, 0, 1]]...)
    >>> print(mtx)
    (0, 1) 1
    (0, 2) 2
    (1, 0) 3
    (1, 2) 1
    (2, 0) 1
    (2, 3) 1
    >>> mtx[:2, :]
    <2x4 sparse matrix of type '<... 'numpy.int64'>'
    with 4 stored elements in LInked List format>
    >>> mtx[:2, :].todense()
    matrix([[0, 1, 2, 0],
    [3, 0, 1, 0]]...)
    >>> mtx[1:2, [0,2]].todense()
    matrix([[3, 1]]...)
    >>> mtx.todense()
    matrix([[0, 1, 2, 0],
    [3, 0, 1, 0],
    [1, 0, 0, 1]]...)