如何在Python的SciPy中更改稀疏矩阵中的元素?

seb*_*seb 18 python math linear-algebra sparse-matrix

我已经构建了一个小代码,我想用它来解决涉及大型稀疏矩阵的特征值问题.它运行正常,我现在要做的就是将稀疏矩阵中的一些元素设置为零,即最顶行中的元素(对应于实现边界条件).我可以调整下面的列向量(C0,C1和C2)来实现这一点.但是,我想知道是否有更直接的方式.显然,NumPy索引不适用于SciPy的稀疏包.

import scipy.sparse as sp
import scipy.sparse.linalg  as la
import numpy as np
import matplotlib.pyplot as plt

#discretize x-axis
N = 11
x = np.linspace(-5,5,N)
print(x)
V = x * x / 2
h = len(x)/(N)
hi2 = 1./(h**2)
#discretize Schroedinger Equation, i.e. build 
#banded matrix from difference equation
C0 = np.ones(N)*30. + V
C1 = np.ones(N) * -16.
C2 = np.ones(N) * 1.
diagonals = np.array([-2,-1,0,1,2])
H = sp.spdiags([C2, C1, C0,C1,C2],[-2,-1,0,1,2], N, N)
H *= hi2 * (- 1./12.) * (- 1. / 2.)
#solve for eigenvalues
EV = la.eigsh(H,return_eigenvectors = False)

#check structure of H
plt.figure()
plt.spy(H)
plt.show()
Run Code Online (Sandbox Code Playgroud)

这是由上面的代码构建的矩阵的可视化.我想要将第一行中的元素设置为零.在此输入图像描述

seb*_*seb 22

正如评论中所建议的那样,我会在我自己的问题中找到答案.SciPy的稀疏包中有几个矩阵类,它们在这里列出.可以将稀疏矩阵从一个类转换为另一个类.因此,对于我需要做的事情,我选择将我的稀疏矩阵转换为类csr_matrix,只需将其转换为

H = sp.csr_matrix(H)
Run Code Online (Sandbox Code Playgroud)

然后我可以使用常规的NumPy表示法将第一行中的元素设置为0:

H[0,0] = 0
H[0,1] = 0
H[0,2] = 0
Run Code Online (Sandbox Code Playgroud)

为了完整起见,我发布了下面的完整修改后的代码段.

#SciPy Sparse linear algebra takes care of sparse matrix computations
#http://docs.scipy.org/doc/scipy/reference/sparse.linalg.html
import scipy.sparse as sp
import scipy.sparse.linalg  as la

import numpy as np
import matplotlib.pyplot as plt

#discretize x-axis
N = 1100
x = np.linspace(-100,100,N)
V = x * x / 2.
h = len(x)/(N)
hi2 = 1./(h**2)

#discretize Schroedinger Equation, i.e. build 
#banded matrix from difference equation
C0 = np.ones(N)*30. + V
C1 = np.ones(N) * -16.
C2 = np.ones(N) * 1.

H = sp.spdiags([C2, C1, C0, C1, C2],[-2,-1,0,1,2], N, N)
H *= hi2 * (- 1./12.) * (- 1. / 2.)
H = sp.csr_matrix(H)
H[0,0] = 0
H[0,1] = 0
H[0,2] = 0

#check structure of H
plt.figure()
plt.spy(H)
plt.show()

EV = la.eigsh(H,return_eigenvectors = False)
Run Code Online (Sandbox Code Playgroud)

  • 如果行数多于列数,则csr速度很快,但如果列数多于行数,则csc更快. (4认同)
  • 如果你要修改矩阵很多基于行的链表稀疏矩阵更快 - 然后使用[lil_matrix](https://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.lil_matrix的.html#scipy.sparse.lil_matrix) (3认同)