Python 稀疏(刚度)矩阵的性能创建
我目前正在实现一个小型有限元模拟。使用Python/Numpy,我正在寻找创建全局刚度矩阵的有效方法: 1) 我认为从较小的单元刚度矩阵创建稀疏矩阵应该使用Python 稀疏(刚度)矩阵的性能创建,python,performance,numpy,matrix,scipy,Python,Performance,Numpy,Matrix,Scipy,我目前正在实现一个小型有限元模拟。使用Python/Numpy,我正在寻找创建全局刚度矩阵的有效方法: 1) 我认为从较小的单元刚度矩阵创建稀疏矩阵应该使用coo_matrix()。但是,我可以扩展现有的coo_矩阵,还是应该从最终的i、j和v列表创建它 2) 目前,我正在使用列表理解从较小的单元刚度矩阵创建i和j列表,并将它们连接起来。有没有更好的方法来创建这些列表 3) 创建数据向量:同样的问题,由于易于扩展,python列表是否优于numpy向量 4) 我当然愿意接受任何建议:)。谢谢大家
coo_matrix()
。但是,我可以扩展现有的coo_矩阵
,还是应该从最终的i、j和v列表创建它
2) 目前,我正在使用列表理解从较小的单元刚度矩阵创建i和j列表,并将它们连接起来。有没有更好的方法来创建这些列表
3) 创建数据向量:同样的问题,由于易于扩展,python列表是否优于numpy向量
4) 我当然愿意接受任何建议:)。谢谢大家!
以下是我目前计划召开全球大会的一个小例子,以明确我的意图:
import numpy as np
from scipy.sparse import coo_matrix
#2 nodes, 3 dof per node
locations = [0, 6]
nNodes = 2
dof =3
totSize = nNodes * dof
Ke = np.array([[1,1,1, 2,2,2],
[1,1,1, 2,2,2],
[1,1,1, 2,2,2],
[2,2,2, 3,3,3],
[2,2,2, 3,3,3],
[2,2,2, 3,3,3]])
I = []
J = []
#generate rowwise i and j lists:
i = [ idx + u for i in range(totSize) for idx in locations for u in range(dof) ]
j = [ idx + u for idx in locations for u in range(dof) for i in range(totSize) ]
I += i
J += J
Data = Ke.flatten()
cMatrix = coo_matrix( (Data, (i,j)), )
在这篇文章中,我将尝试关注创建列表
I
、j
以及最后创建矩阵cMatrix
的性能问题
在这些循环/列表理解下,您基本上是在执行位置
和范围(dof)
的元素级添加。移植到NumPy,我们可以在那里发挥杠杆作用。最后,为了在这些理解中再次模拟range(totSize)
,我们可以使用np.tile
对最终的加法结果进行tile
。我们将使用它作为其展平版本来索引稀疏矩阵的列,并将其转置展平版本用于行
因此,实现看起来是这样的-
idx0 = (np.asarray(locations)[:,None] + np.arange(dof)).ravel()
J = np.tile(idx0[:,None],totSize)
cMatrix = coo_matrix( (Data, (J.ravel('F'),J.ravel())), )
计算
j
的那一行中的i
会覆盖到前面一行中计算的i
。@Divakar-huh?你是说列表中的i
?在python 3中,理解没有泄漏的作用域…。@juanpa.arrivillaga我明白了。是的,我在python2.7上,并在那一步被改写为I
。@divaker跟上时代,伙计;)但实际上,Python3.6可能是Python有史以来最好的版本,尤其是在新的dict
实现中。人们在加载3.6中的第三方软件包时遇到了问题。或者至少是在3.6还处于测试阶段的时候。我的numpy
运行在3.5版上,但大多数numpy
问题和答案都假定为2.7版np.genfromtxt
仍然偏向于bytestring。