ValueError: number of diagonals (1) does not match the number of offsets (3)

ValueError: number of diagonals (1) does not match the number of offsets (3)

在 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) 不匹配

我不明白哪里出了问题。如果有任何帮助,我将不胜感激。

你的问题是 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))

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

data0.shape # (3,)

因此,spdiagsdata0 视为只有一个维度,因此只有一个对角线,但您在 diags0 中为其提供了 3 条对角线,因此出现错误。

您可以对 运行 中的每个元素分别使用简单的列表理解,如下所示:

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))