压缩稀疏行格式 (CSR)

  • 行优先
    • 三个 NumPy 数组:indicesindptrdata
      • indices 是列索引数组

      • data 是对应非零值的数组

      • indptr 指向 indicesdata 中行的起始位置

      • indptr 的长度为 n_row + 1,最后一个元素 = 值的数量 = indicesdata 的长度

      • i 行的非零值是 data[indptr[i]:indptr[i + 1]],列索引为 indices[indptr[i]:indptr[i + 1]]

      • 元素 (i, j) 可以访问为 data[indptr[i] + k],其中 kjindices[indptr[i]:indptr[i + 1]] 中的位置

    • _cs_matrix 的子类(CSR/CSC 通用功能)
      • _data_matrix 的子类(具有 .data 属性的稀疏数组类)

  • 快速的矩阵向量积和其他算术运算(sparsetools)

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

    • 稀疏数组/矩阵

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

    • (data, coords) 元组

    • (data, indices, indptr) 元组

  • 高效的行切片,面向行的操作

  • 缓慢的列切片,对稀疏结构的更改代价昂贵

  • 用途
    • 实际计算(大多数线性求解器支持此格式)

示例

  • 创建空 CSR 数组

    >>> mtx = sp.sparse.csr_array((3, 4), dtype=np.int8)
    
    >>> mtx.toarray()
    array([[0, 0, 0, 0],
    [0, 0, 0, 0],
    [0, 0, 0, 0]], dtype=int8)
  • 使用 (data, coords) 元组创建

    >>> 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 = sp.sparse.csr_array((data, (row, col)), shape=(3, 3))
    >>> mtx
    <Compressed Sparse Row sparse array of dtype 'int64'
    with 6 stored elements and shape (3, 3)>
    >>> mtx.toarray()
    array([[1, 0, 2],
    [0, 0, 3],
    [4, 5, 6]]...)
    >>> mtx.data
    array([1, 2, 3, 4, 5, 6]...)
    >>> mtx.indices
    array([0, 2, 2, 0, 1, 2])
    >>> mtx.indptr
    array([0, 2, 3, 6])
  • 使用 (data, indices, indptr) 元组创建

    >>> data = np.array([1, 2, 3, 4, 5, 6])
    
    >>> indices = np.array([0, 2, 2, 0, 1, 2])
    >>> indptr = np.array([0, 2, 3, 6])
    >>> mtx = sp.sparse.csr_array((data, indices, indptr), shape=(3, 3))
    >>> mtx.toarray()
    array([[1, 0, 2],
    [0, 0, 3],
    [4, 5, 6]])