数组

时间:2016-02-02 22:14:01

标签: python numpy vector average

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

例如距离(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; d = 1时,值= 2,1; d = 14时,值= 3.5;等。

[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的所有值执行此操作,并创建与距离对应的平均值的矢量(或矩阵)。

提前感谢您的出色帮助!

5 个答案:

答案 0 :(得分:3)

众所周知,熊猫会促进此类行动:

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

答案 1 :(得分:3)

使用np.uniquenp.bincount -

的矢量化方法
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 ]])

示例运行 -

.

答案 2 :(得分:2)

它处理列表中的每个案例。根据需要进行调整。

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

答案 3 :(得分:0)

执行此操作的好方法是使用列表推导和enumerate函数。 示例(将1替换为您想要获得的d值):

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

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

答案 4 :(得分:0)

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])