使用 scipy.sparse.diags 的 Scipy 三对角矩阵

Jos*_*r98 3 python matrix scipy

难以从 numpy 数组生成三对角矩阵。我设法复制了此处给出的结果,但我无法将这些技术应用于我的问题。我也可能误解了scipy.sparse.diag的应用。

对于上下文,我正在研究一个需要生成三对角矩阵以使用有限差分数值求解常微分方程的问题。

from scipy.sparse import diags
import numpy as np

v1 = [3*i**2 +(i/2) for i in range(1, 6)]
v2 = [-(6*i**2 - 1) for i in range(1, 6)]
v3 = [3*i**2 -(i/2) for i in range(1, 6)]

matrix = np.array([v1, v2, v3])
Run Code Online (Sandbox Code Playgroud)

matrix等于。

array([[3.5,   13. ,   28.5,   50. ,   77.5],
       [-5. ,  -23. ,  -53. ,  -95. , -149. ],
       [2.5,   11. ,   25.5,   46. ,   72.5]])
Run Code Online (Sandbox Code Playgroud)

在完成 Scipy 文档和上面链接中的示例之后,我期望以下代码生成 yield Tridiagonal_1,但改为 get Tridiagonal_2

diags(matrix, [-1,0,1], (5, 5)).toarray() 
Run Code Online (Sandbox Code Playgroud)

预期的Tridiagonal_1

array([[  -5. ,    2.5 ,     0. ,    0. ,     0. ],
       [  13. ,   -23. ,    11. ,    0. ,     0. ],
       [   0. ,    28.5.,  -53. ,   25.5,     0. ],
       [   0. ,    0. ,     50 ,   -95.,     46. ],
       [   0. ,    0. ,      0. ,   77.5., -149. ]])
Run Code Online (Sandbox Code Playgroud)

代码产生Tridiagonal_2

array([[  -5. ,    2.5,    0. ,    0. ,    0. ],
       [   3.5,  -23. ,   11. ,    0. ,    0. ],
       [   0. ,   13. ,  -53. ,   25.5,    0. ],
       [   0. ,    0. ,   28.5,  -95. ,   46. ],
       [   0. ,    0. ,    0. ,   50. , -149. ]])
Run Code Online (Sandbox Code Playgroud)

我原本希望offset = [-1,0,1]将对角线条目向左移动,但第一个偏移量是将第一个偏移diag到下一行。这是正确的还是我的代码中存在导致此行为的错误?

Pau*_*zer 5

您得到的输出似乎与文档的内容一致,特别是其中的示例。您可以使用以下方法获得您想要的结果spdiags

from scipy import sparse

matrix = np.array([[3.5,   13. ,   28.5,   50. ,   77.5],
                   [-5. ,  -23. ,  -53. ,  -95. , -149. ],
                   [2.5,   11. ,   25.5,   46. ,   72.5]]

sparse.spdiags(matrix, (1,0,-1), 5, 5).T.A
# array([[  -5. ,    2.5,    0. ,    0. ,    0. ],
#        [  13. ,  -23. ,   11. ,    0. ,    0. ],
#        [   0. ,   28.5,  -53. ,   25.5,    0. ],
#        [   0. ,    0. ,   50. ,  -95. ,   46. ],
#        [   0. ,    0. ,    0. ,   77.5, -149. ]])
Run Code Online (Sandbox Code Playgroud)