Я думаю, что самый быстрый способ сделать что-то подобное - это просто сделать три копии массива со смещением по одной относительно друг друга.Например:
In [1]: a = np.arange(12)
In [2]: a
Out[2]: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
In [3]: np.vstack((a,np.roll(a,-1),np.roll(a,-2))).T[:-2]
Out[3]:
array([[ 0, 1, 2],
[ 1, 2, 3],
[ 2, 3, 4],
[ 3, 4, 5],
[ 4, 5, 6],
[ 5, 6, 7],
[ 6, 7, 8],
[ 7, 8, 9],
[ 8, 9, 10],
[ 9, 10, 11]])
, и тогда вы можете просто работать с последней осью с помощью своей функции.Например, чтобы вычислить скользящую сумму:
def window_function(a):
return np.sum(a,axis=-1)
>>> a = np.arange(12)
>>> map(window_function,[a[i:i+3] for i in range(len(a)-2)])
[3, 6, 9, 12, 15, 18, 21, 24, 27, 30]
>>> window_function(np.vstack((a,np.roll(a,-1),np.roll(a,-2))).T[:-2])
array([ 3, 6, 9, 12, 15, 18, 21, 24, 27, 30])
Это можно обобщить с помощью функции:
def get_rolling_window(a,size):
return np.vstack(np.roll(a,-i) for i in range(size)).T[:-size+1]