【发布时间】:2018-03-30 20:22:03
【问题描述】:
在 Matlab/Octave 中,spdiags([-8037.500 50.000 -12.500], 0:2, 1, 51) 给出以下输出:
(1, 1) -> -8037.5
(1, 2) -> 50
(1, 3) -> -12.500
但是,当我在 Python 中使用以下内容时,它不会产生与在 Matlab/Octave 中类似的结果:
import numpy as np
import scipy as sp
data = array([[-8037.5],
[ 50. ],
[ -12.5]])
sp.sparse.spdiags(data, np.r_[0:2 + 1].T, 1, 51).toarray()
Python 的 spdiags() 产生以下输出,其中缺少第一个和第二个索引处的 50 和 -12.5 术语:
array([[-8037.5, 0. , 0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. , 0. , 0. ,
0. , 0. ]])
我查看了this 对类似问题的回答,但我不确定我哪里出错了。
编辑:
我正在尝试构建一个由A_diag1、A_diag2 和A_diag3 组成的矩阵A,如下所示。我已经按照答案中的建议定义了A_diag1 和A_diag3。
import numpy as np
import scipy as sp
A_diag1 = np.tile(np.array([-8037.500, 50, -12.5]), (3,1))
A_diag2 = np.reshape(np.repeat([1250, -18505, 1250], 49), (3, 49))
A_diag3 = np.tile(np.array([12.5, -50, 8037.500]), (3,1))
A = np.concatenate((sp.sparse.spdiags(A_diag1, np.r_[0:2 + 1], 1, 51).toarray(), \
sp.sparse.spdiags(A_diag2, np.r_[0:2 + 1], 49, 51).toarray(), \
sp.sparse.spdiags(A_diag3, np.r_[48:50 + 1], 1, 51).toarray()), axis=0)
但是,A 的最后 3 行和最后 3 列中的五个突出显示的单元格显示为零/单数,如下面的快照所示。我希望那些当前显示为零的突出显示的单元格不为零。 [您可以复制并粘贴上面的代码来重现A 矩阵,从该矩阵中截取如下所示的快照。]
EDIT2:
以下使用sp.sparse.diags() 的代码按预期工作。与sp.sparse.spdiags 不同,使用sp.sparse.diags() 时结果形状(数组维度)的输入参数必须在列表中。
import numpy as np
import scipy as sp
A_diag1 = np.array([[-8037.500], [50], [-12.5]])
A_diag2 = np.reshape(np.repeat([1250, -18505, 1250], 49), (3, 49))
A_diag3 = np.array([[12.5], [-50], [8037.500]])
A = np.concatenate((sp.sparse.diags(A_diag1, np.arange(0, 2 + 1), [1, 51]).toarray(), \
sp.sparse.diags(A_diag2, np.arange(0, 2 + 1), [49, 51]).toarray(), \
sp.sparse.diags(A_diag3, np.arange(48, 50 + 1), [1, 51]).toarray()), axis=0)
【问题讨论】:
标签: python matlab scipy sparse-matrix diagonal