Усреднение значений в массиве, соответствующих значениям другого массива - PullRequest
0 голосов
/ 08 декабря 2018

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

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

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

поэтому значение = 3,3 при d = 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]

Например, на расстоянии 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])

Пожалуйста, помогите!Спасибо

Ответы [ 5 ]

0 голосов
/ 08 декабря 2018

Пакет numpy_indexed (отказ от ответственности: я являюсь его автором) был разработан с учетом следующих вариантов использования:

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

Панды могут делать подобные вещи;но его API действительно не приспособлен к этим вещам;и для такой элементарной операции, как группировка, я чувствую, что неправильно переносить ваши данные в совершенно новую структуру данных.

0 голосов
/ 08 декабря 2018

Вы можете использовать array из библиотеки numpy в сочетании с 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)
0 голосов
/ 08 декабря 2018

Настройка

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  ])
0 голосов
/ 08 декабря 2018

Использование pandas

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

Опция 1: transform для получения значений в тех же позициях

g.transform('mean').values

Опция 2: mean напрямую и получение dict с отображением

g.mean().to_dict()['k']
0 голосов
/ 08 декабря 2018

Вы выполнили сложную часть, просто поместить результаты в новый список так же просто, как:

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