есть ли более эффективный способ получить среднее значение массива в заранее определенных ячейках? например, у меня есть массив чисел и массив, соответствующий начальной и конечной позициям бункера в этом массиве, и я хочу просто взять среднее значение в этих бункерах? У меня есть код, который делает это ниже, но мне интересно, как его можно сократить и улучшить. Спасибо.
from scipy import *
from numpy import *
def get_bin_mean(a, b_start, b_end):
ind_upper = nonzero(a >= b_start)[0]
a_upper = a[ind_upper]
a_range = a_upper[nonzero(a_upper < b_end)[0]]
mean_val = mean(a_range)
return mean_val
data = rand(100)
bins = linspace(0, 1, 10)
binned_data = []
n = 0
for n in range(0, len(bins)-1):
b_start = bins[n]
b_end = bins[n+1]
binned_data.append(get_bin_mean(data, b_start, b_end))
print binned_data
histogram()
метод будет быстрее для большого количества ящиков. Но тебе придется профилировать себя, я не могу сделать это за тебя.Функция Scipy (> = 0.11) scipy.stats.binned_statistic специально отвечает на вышеуказанный вопрос.
Для того же примера, что и в предыдущих ответах, решение Scipy будет
источник
Не уверен, почему эта нить была некротизирована; но вот одобренный в 2014 году ответ, который должен быть намного быстрее:
источник
mean[0] = np.mean(data[0:10])
, хотя правильный ответ должен бытьnp.mean(data[data < 10])
Пакет numpy_indexed (отказ от ответственности: я его автор) содержит функции для эффективного выполнения операций этого типа:
По сути, это то же решение, что я опубликовал ранее; но теперь завернутый в приятный интерфейс, с тестами и всем :)
источник
Я бы добавил, а также чтобы ответить на вопрос, найти средние значения ячеек с использованием histogram2d python, что у scipy также есть функция, специально разработанная для вычисления двумерной статистики с группировкой для одного или нескольких наборов данных
функция scipy.stats.binned_statistic_dd является обобщением этой функции для наборов данных более высоких измерений
источник
Другой альтернативой является использование ufunc.at. Этот метод применяет на месте желаемую операцию по указанным индексам. Мы можем получить позицию корзины для каждой точки данных, используя метод searchsorted. Затем мы можем использовать at для увеличения на 1 позиции гистограммы по индексу, заданному bin_indexes, каждый раз, когда мы встречаем индекс в bin_indexes.
источник