Я пытаюсь ускорить фрагмент кода Python.
Учитывая два одинаковых (numpy) массива, цель состоит в том, чтобы найти среднее значение в одном массиве, скажем, a, соответствующее значениямдругой массив, скажем, б.Индексы массивов синхронизированы.
Например;
a = np.array([1, 1, 1, 2, 2, 2])
b = np.array([10, 10, 10, 20, 20, 20])
Есть два различных значения в a
, 1 и 2. Значения в b
, где есть «1» в a
втем же индексом являются [10, 10, 10].Следовательно, среднее значение (1) равно 10. Аналогично, среднее значение (2) равно 20.
Можно предположить, что различные наборы значений в a
являются известными априори.Значения в a
не обязательно должны быть последовательными, порядок случайный.Я выбрал пример как таковой, чтобы облегчить описание.
Вот как я подошел:
# Accumulate the total sum and count
for index, val in np.ndenumerate(a):
val_to_sum[val] += b[index]
val_to_count[val] += 1
# Calculate the mean
for val in val_to_sum.keys():
if val_to_count[val]: # skip vals with zero count
val_to_mean[val] = val_to_sum[val] / val_to_count[val]
Здесь val_to_sum
и val_to_count
- это словари, которые инициализируются нулями на основе известного списка значений, которые можно увидеть в a
(в данном случае 1 и 2).
Я сомневаюсь, что это самый быстрый способ его расчета.Я ожидаю, что списки будут довольно длинными, скажем, несколько миллионов, а набор возможных значений будет порядка десятков.
Как я могу ускорить это вычисление?
Может ли быть решение? Вдохновленный одним из ответов ниже, это может сделать это:
for val in a
b[a==val].mean()