python 的csr_python稀疏矩阵(CSR型)操作

部分可参考:Python scipy.sparse稀疏矩阵使用感悟​blog.csdn.net

A,M为两csr型稀疏矩阵

1.求稀疏矩阵M的逆可以直接从稀疏矩阵线性代数运算中载入求逆:from scipy.sparse.linalg

import inv,用inv(M),但较慢,且系统提示转换为array后再操作

SparseEfficiencyWarning: splu requires CSC matrix format

warn('splu requires CSC matrix format', SparseEfficiencyWarning)

/usr/local/lib/python3.6/dist-packages/scipy/sparse/linalg/dsolve/linsolve.py:203: SparseEfficiencyWarning: spsolve is more efficient when sparse b is in the CSC matrix format

'is in the CSC matrix format', SparseEfficiencyWarning)

也可通过np.toarray转化为array数组Ma后用np.linalg.inv(Ma)求,速度较快,测试代码如下:

0=time.time()

invM=inv(M)

t1=time.time()

dt=t1-t0

print('time of sparseinv',dt)%某次结果为0.7938435077667236

t0=time.time()

Ma=M.toarray()

invMa=np.linalg.inv(Ma)

t1=time.time()

dt=t1-t0

print('time of inv',dt)%某次结果为0.08079886436462402

注:应该还可通过from scipy.sparse.linalg import spsolve,然后求解invM=spsolve(M,I)(I为与M同尺寸稀疏对角阵)得到,不过笔者暂未测试,而测试了spsolve(M,A),时间比转化为array后求解多,但比直接用稀疏矩阵求逆少,spsolve(M,I)应也一样

2.矩阵乘法C=invM*A直接可用invM*A,invM.dot(A),两者速度相当(笔者测试了有限元求解中得到的两441*441的矩阵(热方程,质量矩阵和刚度矩阵的逆),其时间相当(同一台机器不同时间测试结果不同,可能跟机器的cpu占用相关),与转换成array后再运算也相当,略慢,测试代码如下:

t0=time.time()

P0=invM*A

t1=time.time()

dt=t1-t0

print(dt)%结果为0.04178047180175781

t0=time.time()

P=invM.dot(A)

t1=time.time()

dt=t1-t0

print(dt))%结果为0.02768230438232422

t0=time.time()

invM=invM.toarray()

A=A.toarray()

P=np.dot(invM,A)

t1=time.time()

dt=t1-t0

print(dt)%结果为0.021239757537841797

注:稀疏矩阵的A*B是矩阵乘法,与A.dot(B)相同,相当于array型矩阵的np.dot(A,B)或np.matmul(A, B),而一般array型矩阵的A*B为按位乘法,numpy中矩阵操作及更多运算可见:Numpy 线性代数丨慕课网教程​www.imooc.com

关于numpy中稀疏矩阵的简介和生成可见:python的高级数组之稀疏矩阵 - fighter324 - 博客园​www.cnblogs.com

是否有scipy.sparse的教程,也希望大家推荐。

你可能感兴趣的:(python,的csr)