块压缩行格式 (BSR)¶
- 基本上是 CSR,但使用固定形状的稠密子矩阵代替标量项。
块大小 (R, C) 必须能整除矩阵的形状 (M, N)。
- 三个 NumPy 数组:indices、indptr、data
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]]])