Группировка данных по bin с помощью np.digitize - PullRequest
0 голосов
/ 14 марта 2019

Я ищу способ усреднить данные, которые у меня есть в массиве, исходя из того, насколько они удалены от определенного пикселя.Для этого я создал массив r, который содержит расстояния до центра.Есть второй массив data, который содержит счетчики, которые можно найти в пикселе на этом расстоянии.

Теперь я разделил весь набор данных (который идет от 0 до 1150) на 60 бинов, а затем оцифровалданные, чтобы получить массив, который говорит мне, какое значение принадлежит какому бину.

bins = np.linspace(0,60*20, 60)
digitized = np.digitize(rr, bins)

Существует ли разумный способ применения оцифрованных данных к таким значениям, чтобы все точки с одинаковым значением бина были усреднены?

Массив r имеет форму 380, data такая же.Таким образом, конечный результат должен быть массивом из 60 элементов, который имеет среднее значение всех значений в двоичном формате в data на основе того, какой элемент был назначен для digitized.

1 Ответ

0 голосов
/ 14 марта 2019

Вот моя попытка, хотя я предполагаю, что вы ищете что-то значительно более элегантное?:)

rr = np.random.randint(0, 15, 1000)
rr_sorted = np.sort(rr)

# Bins
bins = [0, 5, 10, 15]

def assume_sorted_digitized(rr_sorted, bins):
    dig = np.digitize(rr_sorted, bins)
    bin_nr, index = np.unique(dig, return_index=True)
    index_adjusted = np.append(index[1:], len(rr_sorted))
    bin_average = np.zeros_like(bins).astype(np.float32)
    last_idx = 0
    for idx, bin_i in zip(index_adjusted, bin_nr):
        bin_average[bin_i] = rr_sorted[last_idx:idx].mean()
        last_idx = idx
    return bin_average

def nonsorted_digitized(rr, bins):
    dig = np.digitize(rr, bins)
    bin_average = np.zeros_like(bins).astype(np.float32)
    for idx in np.unique(dig):
        bin_average[idx] = rr[dig == idx].mean()
    return bin_average

%timeit assume_sorted_digitized(rr_sorted, bins)
%timeit nonsorted_digitized(rr, bins)

Предполагается, что сортировка дает небольшое повышение производительности

86.5 µs ± 5.49 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
113 µs ± 6.23 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
...