Как насчет чего-то вроде:
def running_avg(data, ws):
tmp = np.cumsum(data, axis=-1, dtype='float')
ra = (tmp[..., ws:] - tmp[..., :-ws]) / ws
return ra
Это будет принимать среднее значение по последней оси, если вы хотите стать действительно умным, вы можете сделать так, чтобы функция принимала аргумент оси и принимала среднее значение по произвольномуaxis.
UPDATE
Я считаю, что эта версия соответствует приведенному выше коду.
def running_avg(data, ws):
ra = np.cumsum(data, axis=-1, dtype='float') / ws
ra[..., ws:] = ra[..., ws:] - ra[..., :-ws]
return ra
Для более общего вопроса используйте встроенные функции numpys, такие как cumsum помогаетпотому что они уже это делают, но если вам нужно сделать цикл, вы можете использовать A = np.zeros (A.shape), чтобы получить массив той же формы, что и вход, а затем использовать A [..., i], чтобы всегда работатьв последнем измерении или A [..., i,:] всегда работать со второго по последнее измерение и так далее.Также иногда люди делают data = np.roll (data, axis), чтобы переместить ось в начало, а затем вы используете A [i] для работы с первым измерением и переместите ось назад, если вам нужно.
UPDATE2:
Я только что вспомнил, почему следующее очень плохая идея (по крайней мере, в этом случае):
ra[..., ws:] -= ra[..., :-ws]
Вы должны использовать это вместо:
ra[..., ws:] = ra[..., ws:] - ra[..., :-ws]