2016-02-02 4 views
2

У меня есть массив, который содержит числа, которые являются расстояниями, а другой, который представляет определенные значения на этом расстоянии. Как рассчитать среднее значение всех данных при фиксированном значении расстояния?среднее значение определенных значений массива

расстояния например (D): [1 1 14 6 1 12 14 6 6 7 4 3 7 9 1 3 3 6 5 8]

например данные, соответствующие записи расстояний:

поэтому значение = 3.3 при й = 1; значение = 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]

Для exampe на расстоянии г = 6 следует сделать среднее 2.5, 7.8, 9.2 and 4.3

Я хочу сделать это для всех значений г, которые появляются в моем вектор «D» и создать вектор (или матрица) средних, соответствующих расстоянию.

Благодарим вас за вашу великолепную помощь!

+0

Итак, где ваш код и в чем проблема? – jonrsharpe

+0

Если я правильно понимаю, вы можете сделать 'result = sum (значения [x] для x в диапазоне (len (values)), если расстояния [x] == d); average = sum (result)/len (result) 'где' d' - это расстояние, которое нужно проверить. – zondo

ответ

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 
0

Хороший способ сделать это было бы, используя списочные и функцию enumerate. Пример (заменить 1 с тем, что значение D вы хотите получить):

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

Оттуда вы должны быть в состоянии работать с этим, чтобы найти средние.

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 
3

Векторизованного подход с использованием np.unique и np.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 ]]) 
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]) 
Смежные вопросы