2.5.2.2.7. Block Compressed Row Format (BSR)

  • 基本上是具有固定形状的密集子矩阵而不是标量项的CSR

    • 块大小(R,C)必须均匀地划分矩阵的形状(M,N)
    • 三个NumPy数组:索引indptr数据
      • indices是每个块的列索引的数组
      • data是形状(nnz,R,C)的对应非零值的数组,
      • ...
    • 子类_cs_matrix(公共CSR / CSC功能)
      • _data_matrix的子类(具有.data属性的稀疏矩阵类)
  • 快速矩阵矢量产物和其他算术(稀疏工具)

  • 构造函数接受:
    • 密集矩阵(阵列)
    • 稀疏矩阵
    • 形状元组(创建空矩阵)
    • (data,ij)元组
    • (data,indices,indptr)元组
  • 许多算术运算比具有密集子矩阵的稀疏矩阵的CSR显着更有效

  • 使用:
    • 如CSR
    • 矢量值有限元离散

2.5.2.2.7.1. Examples

  • 创建具有(1,1)块大小(如CSR ...)的空BSR矩阵:

    >>> mtx = sparse.bsr_matrix((3, 4), dtype=np.int8)
    
    >>> mtx
    <3x4 sparse matrix of type '<... 'numpy.int8'>'
    with 0 stored elements (blocksize = 1x1) in Block Sparse Row format>
    >>> mtx.todense()
    matrix([[0, 0, 0, 0],
    [0, 0, 0, 0],
    [0, 0, 0, 0]], dtype=int8)
  • 创建具有(3,2)块大小的空BSR矩阵:

    >>> mtx = sparse.bsr_matrix((3, 4), blocksize=(3, 2), dtype=np.int8)
    
    >>> mtx
    <3x4 sparse matrix of type '<... 'numpy.int8'>'
    with 0 stored elements (blocksize = 3x2) in Block Sparse Row format>
    >>> mtx.todense()
    matrix([[0, 0, 0, 0],
    [0, 0, 0, 0],
    [0, 0, 0, 0]], dtype=int8)
    • 一个错误?
  • 创建使用具有(1,1)块大小(如CSR ...)的(data,ij)元组:

    >>> 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 = sparse.bsr_matrix((data, (row, col)), shape=(3, 3))
    >>> mtx
    <3x3 sparse matrix of type '<... 'numpy.int64'>'
    with 6 stored elements (blocksize = 1x1) in Block Sparse Row format>
    >>> mtx.todense()
    matrix([[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], dtype=int32)
    >>> mtx.indptr
    array([0, 2, 3, 6], dtype=int32)
  • 创建使用(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 = sparse.bsr_matrix((data, indices, indptr), shape=(6, 6))
    >>> mtx.todense()
    matrix([[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]]])