列表列表格式 (LIL)

  • 基于行的链表
    • 每行是一个 Python 列表(排序),包含非零元素的列索引

    • 行存储在 NumPy 数组中(dtype=np.object

    • 非零值数据类似地存储

  • 高效地增量构建稀疏数组

  • 构造函数接受
    • 密集数组/矩阵

    • 稀疏数组/矩阵

    • 形状元组(创建空数组)

  • 灵活的切片,高效地更改稀疏性结构

  • 缓慢的算术运算,由于基于行,所以缓慢的列切片

  • 使用
    • 当稀疏性模式事先未知或会发生变化时

    • 示例:从文本文件读取稀疏数组

示例

  • 创建一个空的 LIL 数组

    >>> mtx = sp.sparse.lil_array((4, 5))
    
  • 准备随机数据

    >>> rng = np.random.default_rng(27446968)
    
    >>> data = np.round(rng.random((2, 3)))
    >>> data
    array([[1., 0., 1.],
    [0., 0., 1.]])
  • 使用花式索引分配数据

    >>> mtx[:2, [1, 2, 3]] = data
    
    >>> mtx
    <List of Lists sparse array of dtype 'float64'
    with 3 stored elements and shape (4, 5)>
    >>> print(mtx)
    <List of Lists sparse array of dtype 'float64'
    with 3 stored elements and shape (4, 5)>
    Coords Values
    (0, 1) 1.0
    (0, 3) 1.0
    (1, 3) 1.0
    >>> mtx.toarray()
    array([[0., 1., 0., 1., 0.],
    [0., 0., 0., 1., 0.],
    [0., 0., 0., 0., 0.],
    [0., 0., 0., 0., 0.]])
    >>> mtx.toarray()
    array([[0., 1., 0., 1., 0.],
    [0., 0., 0., 1., 0.],
    [0., 0., 0., 0., 0.],
    [0., 0., 0., 0., 0.]])
  • 更多切片和索引

    >>> mtx = sp.sparse.lil_array([[0, 1, 2, 0], [3, 0, 1, 0], [1, 0, 0, 1]])
    
    >>> mtx.toarray()
    array([[0, 1, 2, 0],
    [3, 0, 1, 0],
    [1, 0, 0, 1]]...)
    >>> print(mtx)
    <List of Lists sparse array of dtype 'int64'
    with 6 stored elements and shape (3, 4)>
    Coords Values
    (0, 1) 1
    (0, 2) 2
    (1, 0) 3
    (1, 2) 1
    (2, 0) 1
    (2, 3) 1
    >>> mtx[:2, :]
    <List of Lists sparse array of dtype 'int64'
    with 4 stored elements and shape (2, 4)>
    >>> mtx[:2, :].toarray()
    array([[0, 1, 2, 0],
    [3, 0, 1, 0]]...)
    >>> mtx[1:2, [0,2]].toarray()
    array([[3, 1]]...)
    >>> mtx.toarray()
    array([[0, 1, 2, 0],
    [3, 0, 1, 0],
    [1, 0, 0, 1]]...)