【问题标题】:Averaging values in array corresponding to the values of another array平均数组中的值对应于另一个数组的值
【发布时间】:2018-12-07 21:02:36
【问题描述】:

我有一个数组,其中包含表示距离的数字,另一个表示该距离处的某些值。如何计算距离固定值处所有数据的平均值?

例如距离(d):[1 1 14 6 1 12 14 6 6 7 4 3 7 9 1 3 3 6 5 8]

例如与距离条目对应的数据:

因此在 d=1 时值=3.3;值=2,1,d=1;值=3.5,d=14;等等。

[3.3 2.1 3.5 2.5 4.6 7.4 2.6 7.8 9.2 10.11 14.3 2.5 6.7 3.4 7.5 8.5 9.7 4.3 2.8 4.1]

例如,在距离 d=6 处,我应该取 2.5、7.8、9.2 和 4.3 的平均值

我使用了以下有效的代码,但我不知道如何将值存储到新数组中:

from numpy import mean

for d in set(key): 
    print d, mean([dist[i] for i in range(len(key)) if key[i] == d])

请帮忙!谢谢

【问题讨论】:

    标签: python numpy average


    【解决方案1】:

    您已经完成了最困难的部分,只需将您的结果放入一个新列表就很简单:

    result = []
    for d in set(key): 
        result.append(mean([dist[i] for i in range(len(key)) if key[i] == d]))
    

    【讨论】:

      【解决方案2】:

      使用pandas

      g = pd.DataFrame({'d':d, 'k':k}).groupby('d')
      

      选项 1:transform 获取相同位置的值

      g.transform('mean').values
      

      选项2:直接mean,得到一个dict的映射

      g.mean().to_dict()['k']
      

      【讨论】:

        【解决方案3】:

        设置

        d = np.array(
          [1, 1, 14, 6, 1, 12, 14, 6, 6, 7, 4, 3, 7, 9, 1, 3, 3, 6, 5, 8]
        )
        
        k = np.array(
          [3.3,2.1,3.5,2.5,4.6,7.4,2.6,7.8,9.2,10.11,14.3,2.5,6.7,3.4,7.5,8.5,9.7,4.3,2.8,4.1]
        )
        

        scipy.sparse + csr_matrix

        from scipy import sparse
        
        s = d.shape[0]
        r = np.arange(s+1)
        m = d.max() + 1
        b = np.bincount(d)
        
        out = sparse.csr_matrix( (k, d, r), (s, m) ).sum(0).A1
        
        (out / b)[d]
        

        array([ 4.375,  4.375,  3.05 ,  5.95 ,  4.375,  7.4  ,  3.05 ,  5.95 ,
                5.95 ,  8.405, 14.3  ,  6.9  ,  8.405,  3.4  ,  4.375,  6.9  ,
                6.9  ,  5.95 ,  2.8  ,  4.1  ])
        

        【讨论】:

          【解决方案4】:

          您可以将来自numpy 库的array 与同样来自同一个库的where 结合使用。

          您可以定义一个函数来获取所需距离的位置:

          from numpy import mean, array, where  
          
          def key_distances(distances, d):
            return where(distances == d)[0]
          

          然后你用它来获取那些位置的值。

          假设你有:

          d = array([1,1,14,6,1,12,14,6,6,7,4,3,7,9,1,3,3,6,5,8])
          v = array([3.3,2.1,3.5,2.5,4.6,7.4,2.6,7.8,9.2,10.11,14.3,2.5,6.7,3.4,7.5,8.5,9.7,4.3,2.8,4.1])
          

          那么你可能会这样做:

          vs = v[key_distances(d,d[1])]
          

          那么你的意思:

          print mean(vs)
          

          【讨论】:

            【解决方案5】:

            numpy_indexed 包(免责声明:我是它的作者)在设计时考虑了这些用例:

            import numpy_indexed as npi
            npi.group_by(d).mean(dist)
            

            熊猫也可以做类似的事情;但它的 api 并不是真正针对这些东西量身定制的;对于 group-by 这样的基本操作,我觉得必须将您的数据提升到一个全新的数据结构中有点不对。

            【讨论】:

              猜你喜欢
              • 2020-11-03
              • 2016-05-26
              • 1970-01-01
              • 2020-12-15
              • 2019-07-02
              • 1970-01-01
              • 2015-09-12
              • 1970-01-01
              • 2021-09-21
              相关资源
              最近更新 更多