对角线格式 (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.]])