我有一个数组,其中包含距离的数字,另一个数组包含该距离的某些值。 如何计算固定距离值的所有数据的平均值?
例如距离(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的所有值执行此操作,并创建与距离对应的平均值的矢量(或矩阵)。
提前感谢您的出色帮助!
答案 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.unique
和np.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])