@ Andyk уже объяснил в своем посте, как рассчитать среднее значение, имея список индексов.
Я предоставлю решение для получения этих индексов.
Вот общееподход:
from typing import Optional
import numpy as np
def get_split_indices(array: np.ndarray,
*,
window_size: int,
start_value: Optional[int] = None) -> np.ndarray:
"""
:param array: input array with consequent integer indices
:param window_size: specifies range of indices
which will be included in a separate window
:param start_value: from which the window will start
:return: array of indices marking the borders of the windows
"""
if start_value is None:
start_value = array[0]
diff = np.diff(array)
diff_indices = np.where(diff)[0] + 1
slice_ = slice(window_size - 1 - (array[0] - start_value) % window_size,
None,
window_size)
return diff_indices[slice_]
Примеры использования:
Сверяя это с данными вашего примера:
# indices: 3 9
idx = np.array([1,1,1, 2,2,3,3,3,3, 4])
вы можете получитьиндексы, разделяющие разные окна, например:
get_split_indices(idx,
window_size=2,
start_value=0)
>>> array([3, 9])
С помощью этой функции вы также можете указать разные размеры окна:
# indices: 7 11 17
idx = np.array([0,1,1,2,2,3,3, 4,5,6,7, 8,9,10,11,11,11, 12,13])
get_split_indices(idx,
window_size=4,
start_value=0)
>>> array([ 7, 11, 17])
и разные начальные значения:
# indices: 1 7 10 13 18
idx = np.array([0, 1,1,2,2,3,3, 4,5,6, 7,8,9, 10,11,11,11,12, 13])
get_split_indices(idx,
window_size=3,
start_value=-2)
>>> array([ 1, 7, 10, 13, 18])
Обратите внимание, что по умолчанию я сделал первый элемент массива начальным.