三行代码  ›  专栏  ›  技术社区  ›  user19657580

Python中数组中具有相同元素的索引求和

  •  0
  • user19657580  · 技术社区  · 1 月前

    我有两份清单 Ii01 Iv01 . Ii01 由带索引的numpy数组组成。 Iv01 [2.1] 在里面 Iv01 对应于 [3,1] 在里面 Ii01

    j 。例如,对应于 [0, 3],[2, 3],[4, 3] Iv01 由于有3个元素 j=3 .类似地,对应于 [0, 4],[2, 4] 在里面 Iv01 j=4 .我给出了预期输出。

    import numpy as np
    Ii01 = [np.array([[3, 1],
           [0, 2],
           [0, 3],
           [2, 3],
           [4, 3],
           [0, 4],
           [2, 4]])]
    
    Iv01 = [np.array([[2.1],
           [3.4],
           [1.5],
           [9.7],
           [6.5],
           [4.2],
           [1.7]])]
    

    预期输出为

    [np.array([[2.1],
           [3.4],
           [1.5+9.7+6.5],
           [4.2+1.7]])]
    
    1 回复  |  直到 1 月前
        1
  •  0
  •   j1-lee    1 月前

    一种方法是使用最小二乘法的特性,尽管它可能看起来有点神秘。

    import numpy as np
    
    a = np.array([[3, 1], [0, 2], [0, 3], [2, 3], [4, 3], [0, 4], [2, 4]])
    
    uniq = np.unique(a[:, 1][None, :])
    
    y = a[:, 0]
    x = a[:, 1][:, None] == uniq
    
    output = np.vstack((np.linalg.lstsq(x, y, rcond=None)[0], uniq)).T
    
    print(output)
    # [[3. 1.]
    #  [0. 2.]
    #  [2. 3.]
    #  [1. 4.]]
    

    另一种选择是不使用 numpy itertools.groupby 。这假设同一组由

    from itertools import groupby
    from operator import itemgetter
    
    def mean(xs):
        return sum(xs) / len(xs)
    
    output = [[mean([x[0] for x in g]), k] for k, g in groupby(a, key=itemgetter(1))]
    
    print(output) # [[3.0, 1], [0.0, 2], [2.0, 3], [1.0, 4]]
    

    顺便说一句,请注意 Ii01 是单身汉 数组的。在上述代码中,我假设您只处理一个数组,即。, a = Ii01[0] .