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]]...)