对角线格式 (DIA)¶
非常简单的方案
- 密集 NumPy 数组中对角线的形状为 (n_diag, length)
固定长度 -> 当远离主对角线时会浪费一些空间
是
_data_matrix
(具有 .data 属性的稀疏数组类)的子类
- 每个对角线的偏移量
0 是主对角线
负偏移量 = 下方
正偏移量 = 上方
快速矩阵 * 向量 (sparsetools)
- 快速且简单的逐元素运算
直接操作数据数组(快速的 NumPy 机制)
- 构造函数接受
密集数组/矩阵
稀疏数组/矩阵
形状元组(创建空数组)
(data, offsets) 元组
没有切片,没有单个项目的访问
- 使用
相当专门化
通过有限差分求解偏微分方程
使用迭代求解器
示例¶
创建一些 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 = sp.sparse.dia_array((data, offsets), shape=(4, 4)) >>> mtx <DIAgonal sparse array of dtype 'int64' with 9 stored elements (3 diagonals) and shape (4, 4)> >>> mtx.toarray() array([[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 = sp.sparse.dia_array((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) <DIAgonal sparse array of dtype 'int64' with 9 stored elements (3 diagonals) and shape (4, 4)> Coords Values (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.toarray() array([[ 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 * vec).toarray() array([[ 1., 0., 11., 0.], [ 5., 2., 0., 12.], [ 0., 6., 3., 0.], [ 0., 0., 7., 4.]])