我的代码中有以下类型的列表:
nodes = [[n1, [x1,y1,z1], [a1,b1,...]], [n2, [x2,y2,z2], [a2,b2,..]], ...]
元素n标识具有特定坐标[x,y,z]的节点,这些可以通过列表重复。 我想对每个节点值的[an,bn,…]列表求平均值n,这样我就得到了一个列表节点\u平均值,比如[[[x1,y1,z1],[a1,b1,…],[[xn,yn,zn],[an,bn,…]]
例如,如果我有以下列表:
nodes= [[10, [6.5, 55.2, -10.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]],
[10, [6.5, 55.2, -10.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]],
[3, [4.3, 55.4, -15.0], [-0.0016, -0.00058, -0.0256, -7.07e-06, 0.00051, 0.0088]],
[1, [8.7, 54.9, -15.0], [-0.0016, -0.00058, -0.0256, 1.2e-05, -0.00044, 0.0088]],
[10, [6.5, 55.2, -10.0], [-0.0011, -0.00041, -0.027, -1.12e-05, -0.00043, 0.0038]],
[3, [4.3, 55.4, -15.0], [-0.00113, -0.000413, -0.027, 2.84e-06, 0.00039, 0.00389]]]
我想获得(订单不重要):
nodes_avg= [[[6.5, 55.2, -10.0], [-0.00036666666666666667, -0.00013666666666666666, -0.009, -3.7333333333333333e-06, -0.00014333333333333334, 0.0012666666666666666]],
[[4.3, 55.4, -15.0], [-0.001365, -0.0004965, -0.0263, -2.115e-06, 0.00045, 0.006345]],
[[8.7, 54.9, -15.0], [-0.0016, -0.00058, -0.0256, 1.2e-05, -0.00044, 0.0088]]]
到目前为止,我的方法是提取节点范围的列表:
noderng = [n1, n2,..., nn]
并使用node_range=list(dict.fromkeys(node_range))消除重复的节点,然后迭代两个列表以将节点列表中的元素n匹配到节点范围列表中的元素,如下所示:
noderng=[]
for l in nodes:
noderng.append(l[0])
noderng=list(dict.fromkeys(noderng))
nodeavg={}
elposition={}
for n in noderng:
nodeavg[n]=[[],[],[],[],[],[]]
for l in nodes:
if int(l[0])==int(n):
for i in range(6):
nodeavg[n][i].append(l[2][i])
elposition[n]=l[1]
avg={}
for key, strains in nodeavg.items():
avg[key]=[]
for ess in strains:
avg[key].append(sum(ess)/len(ess))
nodes_avg=[]
for key ,value in avg.items():
nodes_avg.append([elposition[key],value])
我得到了期望的结果,问题是节点列表可能有成百上千个元素,执行此操作需要几个小时。我已经改用了numpy阵列,它确实有点帮助,但它只缩短了几分钟,这不是一个很大的帮助
有没有更有效的方法来执行此操作
这不是答案,只是一些建议:
您可以使用timer和cProfile来了解代码的哪一部分需要更多的时间,并将注意力集中在这一部分上
另一个在过去对我有效的建议是从包含键的集合中创建字典。通过这种方式,可以减少散列时间。如果您事先知道所有的n值,那么这是可行的
选中this可以更好地理解Python中不同结构的时间复杂性
相关问题 更多 >
编程相关推荐