2.5.2.2.7. ブロック行圧縮格納方式 (BSR)¶
基本的には CSR でスカラー要素の代わりに密な固定シェイプの部分行列を持ちます
ブロックサイズ (R, C) は行列のシェイプ (M, N) を偶数で割ったものでなければいけません
- 3つの NumPy 配列: indices, indptr, data
indices は各ブロックの列インデクスの配列
data はシェイプ (nnz, R, C) のシェイプを持つ非ゼロの値に対応する配列
- ...
_cs_matrix
(CSR/CSC 共通の機能を持つ) の派生クラス_data_matrix
(.data 属性を持つ疎行列) の派生クラス
行列ベクトル積と他の算術演算が高速です (sparsetools)
- コンストラクタは以下を受け付けます:
密行列(配列)
疎行列
シェイプタプル (空の行列を作ります)
(data, ij) タプル
(data, indices, indptr) タプル
CSR と比べて、多くの算術演算がかなり効率です、密な部分行列を持つことによって。
- 利用:
CSR と同様
ベクトル値をとる有限要素離散化
2.5.2.2.7.1. 例¶
空の BSR 行列を (1, 1) ブロックサイズで (CSR のような...) 作る:
>>> 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)
空の BSR 行列を (3, 2) ブロックサイズで作る:
>>> 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)
バグ?
(data, ij) タプルを使って (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 = 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]]])