2.5.2.2.1. Diagonal Format (DIA)

  • 非常简单的方案
  • 形状(n_diag,length)的密集NumPy阵列中的对角线
    • 固定长度 - >浪费空间有点远离主对角线
    • _data_matrix的子类(具有.data属性的稀疏矩阵类)
  • 偏移量
    • 0是主对角线
    • 负偏移=下
    • 正偏移=上
  • 快速矩阵*向量(稀疏工具)
  • 快速和容易的逐项操作
    • 直接操作数组数组(快速NumPy机械)
  • 构造函数接受:
    • 密集矩阵(阵列)
    • 稀疏矩阵
    • 形状元组(创建空矩阵)
    • (数据,偏移量)元组
  • 没有切片,没有个别项目访问
  • 使用:
    • 相当专业
    • 通过有限差分求解PDE
    • 与迭代求解器

2.5.2.2.1.1. Examples

  • 创建一些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.]])