2.5.2.2.1. 対角圧縮格納方式 (DIA)¶
- とても単純な方式 
- 対角方向に密でシェイプが (n_diag, length) な NumPy 配列
- 固定長 -> 主要な要素が対角でない場合は空間が無駄に 
- _data_matrix(.data 属性を持つ疎行列) の派生クラス
 
 
- 各対角要素間のオフセット
- 0 が対角要素 
- 負のオフセット = 下方向 
- 正のオフセット = 上方向 
 
 
- 高速な行列 * ベクトル (sparsetools) 
- 高速で簡単な要素毎の演算
- データ配列の直接的な操作 (Numpy の高速な仕組み) 
 
 
- コンストラクタは以下を受け付けます:
- 密行列(配列) 
- 疎行列 
- シェイプタプル (空の行列を作ります) 
- (data, offsets) タプル 
 
 
- スライスや個々の要素へのアクセスはできません 
- 利用:
- 特に以下のような利用に特化しています 
- 有限差分で PDE を解く 
- 反復解法で 
 
 
2.5.2.2.1.1. 例¶
- DIA 行列をいくつか作ります - >>> data = np.array([[1, 2, 3, 4]]).repeat(3, axis=0) >>> data array([[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]]) >>> offsets = np.array([0, -1, 2]) >>> mtx = sparse.dia_matrix((data, offsets), shape=(4, 4)) >>> mtx <4x4 sparse matrix of type '<... 'numpy.int64'>' with 9 stored elements (3 diagonals) in DIAgonal format> >>> mtx.todense() matrix([[1, 0, 3, 0], [1, 2, 0, 4], [0, 2, 3, 0], [0, 0, 3, 4]]) >>> data = np.arange(12).reshape((3, 4)) + 1 >>> data array([[ 1, 2, 3, 4], [ 5, 6, 7, 8], [ 9, 10, 11, 12]]) >>> mtx = sparse.dia_matrix((data, offsets), shape=(4, 4)) >>> mtx.data array([[ 1, 2, 3, 4], [ 5, 6, 7, 8], [ 9, 10, 11, 12]]...) >>> mtx.offsets array([ 0, -1, 2], dtype=int32) >>> print(mtx) (0, 0) 1 (1, 1) 2 (2, 2) 3 (3, 3) 4 (1, 0) 5 (2, 1) 6 (3, 2) 7 (0, 2) 11 (1, 3) 12 >>> mtx.todense() matrix([[ 1, 0, 11, 0], [ 5, 2, 0, 12], [ 0, 6, 3, 0], [ 0, 0, 7, 4]]) 
- スキーマの説明: - offset: row 2: 9 1: --10------ 0: 1 . 11 . -1: 5 2 . 12 -2: . 6 3 . -3: . . 7 4 ---------8
- 行列とベクトルの積 - >>> vec = np.ones((4, )) >>> vec array([ 1., 1., 1., 1.]) >>> mtx * vec array([ 12., 19., 9., 11.]) >>> mtx.toarray() * vec array([[ 1., 0., 11., 0.], [ 5., 2., 0., 12.], [ 0., 6., 3., 0.], [ 0., 0., 7., 4.]]) 
