Python:scipy.sparse.diags矩阵中的元素赋值

时间:2015-07-08 16:31:46

标签: python numpy matrix scipy

我正在尝试更改使用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()

1 个答案:

答案 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函数和方法将一种格式转换为另一种格式,以利用各自的优势。但是开发人员还没有实现所有可能的组合。您需要阅读各种格式的优缺点,并注意每种格式的方法。