我正在尝试更改使用scipy.sparse.diags
函数创建的矩阵中的行。但是,它返回以下错误,表示我无法分配给此对象:
TypeError: 'dia_matrix' object does not support item assignment
有没有办法绕过这个而不必改变用于形成三对角矩阵的原始向量?以下是我的代码:
def Mass_Matrix(x0):
"""Finds the Mass matrix for any non uniform mesh x0"""
x0 = np.array(x0)
N = len(x0) - 1
h = x0[1:] - x0[:-1]
a = np.zeros(N+1)
a[0] = h[0]/3
for j in range(1,N):
a[j] = h[j-1]/3 + h[j]/3
a[N] = h[N-1]/3
b = h/6
c = h/6
data = [a.tolist(), b.tolist(), c.tolist()]
Positions = [0,1,-1]
Mass_Matrix = diags(data, Positions, (N+1,N+1))
return Mass_Matrix
def Initial_U(x0): #BC here
x0 = np.array(x0)
h = x0[1:] - x0[:-1]
N = len(x0) - 1
Mass = Mass_Matrix(x0)
Mass[0] = 0 #ITEM ASSIGNMENT ERROR
print Mass.toarray()
答案 0 :(得分:1)
对于使用函数定义的稀疏矩阵:
x0=np.arange(10)
mm=Mass_Matrix(x0)
csr
格式是通常用于计算的格式,例如矩阵乘法和linalg求解。它确实定义了赋值,但提供了效率警告:
In [29]: mmr=mm.tocsr()
In [30]: mmr[0]=0
/usr/lib/python3/dist-packages/scipy/sparse/compressed.py:690: SparseEfficiencyWarning: Changing the sparsity structure of a csr_matrix is expensive. lil_matrix is more efficient.
SparseEfficiencyWarning)
lil
工作正常
In [31]: mml=mm.tolil()
In [32]: mml[0]=0
许多sparse
函数和方法将一种格式转换为另一种格式,以利用各自的优势。但是开发人员还没有实现所有可能的组合。您需要阅读各种格式的优缺点,并注意每种格式的方法。