块压缩行格式 (BSR)

  • 基本上是 CSR,但使用固定形状的稠密子矩阵代替标量项。
    • 块大小 (R, C) 必须能整除矩阵的形状 (M, N)

    • 三个 NumPy 数组:indicesindptrdata
      • indices 是每个块的列索引数组。

      • data 是对应非零值的数组,形状为 (nnz, R, C)

    • _cs_matrix 的子类(CSR/CSC 的公共功能)
      • _data_matrix 的子类(具有 .data 属性的稀疏矩阵类)

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

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

    • 稀疏数组/矩阵

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

    • (data, coords) 元组

    • (data, indices, indptr) 元组

  • 对于具有稠密子矩阵的稀疏矩阵,许多算术运算效率远高于 CSR。

  • 用法
    • 类似 CSR

    • 向量值有限元离散化

示例

  • 创建具有 (1, 1) 块大小的空 BSR 数组(类似 CSR…)

    >>> mtx = sp.sparse.bsr_array((3, 4), dtype=np.int8)
    
    >>> mtx
    <Block Sparse Row sparse array of dtype 'int8'
    with 0 stored elements (blocksize=1x1) and shape (3, 4)>
    >>> mtx.toarray()
    array([[0, 0, 0, 0],
    [0, 0, 0, 0],
    [0, 0, 0, 0]], dtype=int8)
  • 创建具有 (3, 2) 块大小的空 BSR 数组

    >>> mtx = sp.sparse.bsr_array((3, 4), blocksize=(3, 2), dtype=np.int8)
    
    >>> mtx
    <Block Sparse Row sparse array of dtype 'int8'
    with 0 stored elements (blocksize=3x2) and shape (3, 4)>
    >>> mtx.toarray()
    array([[0, 0, 0, 0],
    [0, 0, 0, 0],
    [0, 0, 0, 0]], dtype=int8)
    • 一个 bug?

  • 使用 (data, coords) 元组创建,块大小为 (1, 1)(类似 CSR…)

    >>> 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.bsr_array((data, (row, col)), shape=(3, 3))
    >>> mtx
    <Block Sparse Row sparse array of dtype 'int64'
    with 6 stored elements (blocksize=1x1) 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) 元组创建,块大小为 (2, 2)

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