在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)
我不明白什么是错的。我很感激任何帮助。
答案 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))