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]]])