Scipy dia_matrix的Python示例

use*_*773 1 python scipy sparse-matrix python-2.7

运行这段代码

d0  = np.ones(N)
dp1 = np.ones(N - 1)
dm1 = np.ones(N - 1)

diag = [[d0],[dp1],[dm1]]
offsets = [0,1,-1]

A = dia_matrix( (diag,offsets), shape=(N,N), dtype=float)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

File "/usr/local/lib/python2.7/dist-packages/scipy/sparse/dia.py", line 109, in __init__
self.data = np.atleast_2d(np.array(arg1[0], dtype=dtype, copy=copy))
Run Code Online (Sandbox Code Playgroud)

ValueError:使用序列设置数组元素。

我不明白我在做什么错!有人可以给我一个正确的榜样来做我想做的事情吗?

War*_*ser 5

当的第一个参数dia_matrix的形式为时(data, offsets)data预计将是一个2维数组,每行都包含data矩阵的对角线。由于data是矩形矩阵,因此data将忽略其中的某些元素。次对角线是“左对齐”,而超对角线是“右对齐”。(特别是data和稀疏矩阵之间的映射Adata[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]
Run Code Online (Sandbox Code Playgroud)

data包含三个对角线。既然offset[0]是0,则第0行data包含主对角线。该行中的所有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]])
Run Code Online (Sandbox Code Playgroud)

您的示例可以重写如下:

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.]])
Run Code Online (Sandbox Code Playgroud)

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.]])
Run Code Online (Sandbox Code Playgroud)