ValueError:对角线数(1)与偏移数不匹配(3)

时间:2017-12-10 02:22:06

标签: python sparse-matrix

在python 2.7中,我尝试创建一个包含3个对角线的稀疏矩阵。矩阵应该如下所示:

[[ 10   0   0   0 -19   0   0   0  10   0   0   0  ...  0]
 [  0  10   0   0   0 -19   0   0   0  10   0   0  ...  0]
 [  0   0  10   0   0   0 -19   0   0   0  10   0  ...  0]
 [ -1   1   1   0   0   0   0   0   0   0   0   0  ...  0]]

我的代码是

import numpy as np
import numpy.matlib
import scipy.sparse

Dk = np.array([[ 10.], [ 10.],[ 10.]])
Ns = 3
N = 100
z = np.array([[-1.],
   [ 1.],
   [ 1.]])

dg0 = np.array([numpy.matlib.repmat(1-2*Dk,1,1)])
dgn = np.array([numpy.matlib.repmat(Dk,1,1)])
dgp = np.array([numpy.matlib.repmat(Dk,1,1)])

B = np.zeros((Ns+1,N))

dg0 = np.append(dg0,0) 
dgn = np.append(dgn,0)
dgp = np.append(dgp,0)
zerosN1 = np.zeros((1,Ns+1))
zerosN2 = np.zeros((1,2*(Ns+1)))
dg0 = np.append(zerosN1,dg0)
dgp = np.append(zerosN2,dgp)

data0 = np.array([dgn,dg0,dgp])
diags0 = np.array([0,Ns+1,2*(Ns+1)])

B = scipy.sparse.spdiags(data0, diags0, Ns+1, N)
B = scipy.sparse.lil_matrix(B)
zerosN = np.zeros((1,N-Ns))
B[3] = np.append(z,zerosN)

我收到错误:ValueError:对角线数量(1)与偏移量数量不匹配(3)

我不明白什么是错的。我很感激任何帮助。

2 个答案:

答案 0 :(得分:1)

你的问题是data0看起来像这样:

array([array([ 10.,  10.,  10.,   0.]),
       array([  0.,   0.,   0.,   0., -19., -19., -19.,   0.]),
       array([  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,  10.,  10.,  10.,
         0.])], dtype=object)

我不确定你在使用repmat(或者你的程序的很多部分)做了什么,因为你需要做的就是从对角线创建一个稀疏矩阵。相同数量的对角线(长度相同)与提供的偏移量相同。因此,这应该足够了:

flattened_Dk = Dk.ravel()
data0 = [flattened_Dk, 1-2*flattened_Dk, flattened_Dk]
B = scipy.sparse.diags(data0, diags0, shape=(Ns,N))

答案 1 :(得分:0)

数组data0是一个包含三个不同长度列表的一维数组:

data0.shape # (3,)

因此,spdiags认为data0只有一个维度,因此只有一个对角线,但是你在diags0中提供了3个对角线,因此错误。

您可以使用简单的列表推导来分别运行data0中的每个元素,如下所示:

B = [scipy.sparse.spdiags(data0[i], diags0[i], Ns+1, N) for i in range(len(data0))]
B = np.array([scipy.sparse.lil_matrix(b) for b in B])
zerosN = np.zeros((1,N-Ns))
B = np.append(B, np.append(z,zerosN))