当dia_matrix 的第一个参数具有(data, offsets) 的形式时,data 应为二维数组,data 的每一行都包含矩阵的对角线。由于data 是一个矩形矩阵,所以data 中的一些元素会被忽略。下对角线“左对齐”,超对角线“右对齐”。 (具体来说,data 和稀疏矩阵A 之间的映射是data[i,j] == A[j - offsets[i], j]。)例如,考虑以下将用于创建 5x5 矩阵:
In [28]: data
Out[28]:
array([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10],
[11, 12, 13, 14, 15]])
In [29]: offsets
Out[29]: [0, 1, -1]
data 包含三个对角线。由于offset[0] 为0,data 的第0 行包含主对角线。该行中的所有 5 个元素都用于矩阵中。 offset[1] 为 1,因此 data[1] 中的数据成为第一个超对角线。只会使用值[7, 8, 9, 10];第一个值6 被忽略。同样,data 的第三行给出了第一个对角线,并且只使用了值[11, 12, 13, 14]。
In [30]: a = dia_matrix((data, offsets), shape=(5, 5))
In [31]: a.A
Out[31]:
array([[ 1, 7, 0, 0, 0],
[11, 2, 8, 0, 0],
[ 0, 12, 3, 9, 0],
[ 0, 0, 13, 4, 10],
[ 0, 0, 0, 14, 5]])
你的例子可以改写如下:
In [32]: N = 5
In [33]: data = np.ones((3, 5))
In [34]: A = dia_matrix((data, offsets), shape=(N, N), dtype=float)
In [35]: A.A
Out[35]:
array([[ 1., 1., 0., 0., 0.],
[ 1., 1., 1., 0., 0.],
[ 0., 1., 1., 1., 0.],
[ 0., 0., 1., 1., 1.],
[ 0., 0., 0., 1., 1.]])
dia_matrix 文档字符串还有另一个例子。
或者,您可以使用scipy.sparse.diags 创建矩阵。如果您已经有生成“正确”大小的对角线的代码,这将很有用。使用diags,您不必创建矩形data 矩阵。例如,
In [104]: from scipy.sparse import diags
In [105]: d0 = ones(n)
In [106]: dp1 = np.ones(N - 1)
In [107]: dm1 = np.ones(N - 1)
In [108]: d = [d0, dp1, dm1]
In [109]: B = diags(d, offsets, dtype=float)
In [110]: B.A
Out[110]:
array([[ 1., 1., 0., 0., 0.],
[ 1., 1., 1., 0., 0.],
[ 0., 1., 1., 1., 0.],
[ 0., 0., 1., 1., 1.],
[ 0., 0., 0., 1., 1.]])