Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在列表中查找重复的元素并平均相应的元素_Python_Arrays_Numpy - Fatal编程技术网

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阵列,它确实有点帮助,但它只缩短了几分钟,这不是一个很大的帮助


有没有更有效的方法来执行此操作?

这不是答案,只是一些建议:

  • 您可以使用和了解代码的哪一部分需要更多的时间,并专注于这一部分

  • 另一个在过去对我有效的建议是从包含键的集合中创建字典。通过这种方式,可以减少散列时间。如果您事先知道所有的n值,那么这是可行的

  • 检查以更好地了解Python中不同结构的时间复杂性


  • 为了更好地理解这个问题,请提供一个。我们必须查看代码,甚至开始理解您想要什么。另外,为相应的输入提供电流输出,并解释为什么这不是您想要的。作为补充说明,如果您有一个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])