Я хотел бы разбить массив на фрагменты, суммировать значения в каждом фрагменте и вернуть результат в виде другого массива. Кусочки могут иметь разные размеры. Это можно наивно сделать, используя numpy Split функцию, подобную этой
def split_sum(a: np.ndarray, breakpoints: np.ndarray) -> np.ndarray:
return np.array([np.sum(subarr) for subarr in np.split(a, breakpoints)])
Однако здесь по-прежнему используется цикл for Python, поэтому он неэффективен для больших массивов. Есть ли более быстрый способ?
На самом деле вы не будете использовать массив в numpy, если это не последний шаг.
Numpy может обрабатывать вашу операцию изначально с помощью numpy.add.reduceat (незначительное отличие от вашей функции заключается в том, как определяются точки останова, вам нужно будет добавить split
с 0
):
arr = np.arange(20)
breakpoints = np.array([2, 5, 10, 12])
def split_sum(a: np.ndarray, breakpoints: np.ndarray) -> np.ndarray:
return np.array([np.sum(subarr) for subarr in np.split(a, breakpoints)])
split_sum(arr, breakpoints)
# array([ 1, 9, 35, 21, 124])
np.add.reduceat(arr, np.r_[0, breakpoints])
# array([ 1, 9, 35, 21, 124])