【问题标题】:average of certain values of an array数组的某些值的平均值
【发布时间】:2016-02-02 22:14:01
【问题描述】:

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

例如距离 (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 and 4.3 的平均值

我想对出现在我的向量“d”中的所有 d 值执行此操作,并创建一个与距离相对应的平均值向量(或矩阵)。

提前感谢您的大力帮助!

【问题讨论】:

  • 那么你的代码在哪里,它到底有什么问题?
  • 如果我理解正确,你可以result = sum(values[x] for x in range(len(values)) if distances[x] == d); average = sum(result) / len(result) d 是要检查的距离。

标签: python numpy vector average


【解决方案1】:

众所周知,Pandas 可以促进此类操作:

dist=[1,1,14,6,1,12,14,6,6,7,4,3,7,9,1,3,3,6,5,8]
val=[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]

import pandas as pd
df=pd.DataFrame()
df['val']=val
df['dist']=dist
df.groupby('dist').mean()

打印:

dist
1        4.375
3        6.900
4       14.300
5        2.800
6        5.950
7        8.405
8        4.100
9        3.400
12       7.400
14       3.050

【讨论】:

    【解决方案2】:

    使用np.uniquenp.bincount 的矢量化方法-

    unq,idx,counts = np.unique(dist,return_counts=True,return_inverse=True)
    mean_out = np.bincount(idx,value)/counts
    

    示例运行 -

    In [49]: dist
    Out[49]: 
    array([ 1,  1, 14,  6,  1, 12, 14,  6,  6,  7,  4,  3,  7,  9,  1,  3,  3,
            6,  5,  8])
    
    In [50]: value
    Out[50]: 
    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 ])
    
    In [51]: unq,idx,counts = np.unique(dist,return_counts=True,return_inverse=True)
        ...: mean_out = np.bincount(idx,value)/counts
        ...: 
    
    In [52]: np.column_stack((unq,mean_out))
    Out[52]: 
    array([[  1.   ,   4.375],
           [  3.   ,   6.9  ],
           [  4.   ,  14.3  ],
           [  5.   ,   2.8  ],
           [  6.   ,   5.95 ], # Mean of [2.5, 7.8, 9.2 and 4.3]
           [  7.   ,   8.405],
           [  8.   ,   4.1  ],
           [  9.   ,   3.4  ],
           [ 12.   ,   7.4  ],
           [ 14.   ,   3.05 ]])
    

    【讨论】:

      【解决方案3】:

      这会处理列表中的所有情况。根据需要进行调整。

      key = [1, 1, 14, 6, 1, 12, 14, 6, 6, 7, 4, 3, 7, 9, 1, 3, 3, 6, 5, 8]
      dist = [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]
      
      for d in set(key):
          choose = [dist[i] for i in range(len(key)) if key[i] == d]
          print d, float(sum(choose)) / len(choose)
      

      您可以使用 NumPy 进一步缩短代码:

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

      输出:

      1 4.375
      3 6.9
      4 14.3
      5 2.8
      6 5.95
      7 8.405
      8 4.1
      9 3.4
      12 7.4
      14 3.05
      

      【讨论】:

        【解决方案4】:

        一个很好的方法是利用列表推导和enumerate 函数。 示例(将 1 替换为您想要获得的 d 值):

        [data[ind] for ind, val in enumerate(distances) if val == 1]
        

        从那里您应该能够使用它来找到平均值。

        【讨论】:

          【解决方案5】:
          dist=[1,1,14,6,1,12,14,6,6,7,4,3,7,9,1,3,3,6,5,8]  
          val=[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]  
          pair = zip(key, val)
          x = 6 # what you are searching for     
          average = sum([item[1] for item in pair if item[0] == x]) / sum([1 for item in pair if item[0] ==x])
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-10-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-02-09
            相关资源
            最近更新 更多