Python 在列表中查找重复的元素并平均相应的元素
我的代码中有以下类型的列表:Python 在列表中查找重复的元素并平均相应的元素,python,arrays,numpy,Python,Arrays,Numpy,我的代码中有以下类型的列表: nodes = [[n1, [x1,y1,z1], [a1,b1,...]], [n2, [x2,y2,z2], [a2,b2,..]], ...] 元素n标识具有特定坐标[x,y,z]的节点,这些可以通过列表重复。 我想对每个节点值n的[an,bn,…]列表求平均值,这样我得到的列表节点_的平均值为[[[x1,y1,z1],[a1,b1,…],[[xn,yn,zn],[an,bn,…]] 例如,如果我有以下列表: nodes= [[10, [6.5, 55.2,
nodes = [[n1, [x1,y1,z1], [a1,b1,...]], [n2, [x2,y2,z2], [a2,b2,..]], ...]
元素n标识具有特定坐标[x,y,z]的节点,这些可以通过列表重复。
我想对每个节点值n的[an,bn,…]列表求平均值,这样我得到的列表节点_的平均值为[[[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]]]
我想获得(订单不重要):
到目前为止,我的方法是提取节点范围的列表:
noderng = [n1, n2,..., nn]
并使用node_range=list(dict.fromkeys(node_range))消除重复的节点,然后在两个列表上迭代以将节点列表中的元素n与节点_range列表中的元素匹配,如下所示:
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阵列,它确实有点帮助,但它只缩短了几分钟,这不是一个很大的帮助
有没有更有效的方法来执行此操作?这不是答案,只是一些建议:
为了更好地理解这个问题,请提供一个。我们必须查看代码,甚至开始理解您想要什么。另外,为相应的输入提供电流输出,并解释为什么这不是您想要的。作为补充说明,如果您有一个GPU,并且numpy被证明是有用的,那么对于非常大的阵列,您可以尝试使用与numpy语法非常相似的
torch
。可能您的问题是矢量化错误,您必须显示代码。@Gulzar谢谢大家,我已经添加了更多信息。
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])