Python 稀疏(刚度)矩阵的性能创建

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) 我当然愿意接受任何建议:)。谢谢大家

我目前正在实现一个小型有限元模拟。使用Python/Numpy,我正在寻找创建全局刚度矩阵的有效方法:

1) 我认为从较小的单元刚度矩阵创建稀疏矩阵应该使用
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。