Похоже, вы хотите, чтобы среднее значение (выбранное) двигалось windows. Лишь для немногих (относительно общего размера) эта итерация, вероятно, является хорошей (и самой быстрой).
Но при использовании strides
есть трюк с движущимся окном. Один из пакетов обработки изображений имеет функцию window
, которую будут цитировать другие, но с самим numpy
:
In [204]: x = np.lib.stride_tricks.as_strided(arr,shape=(14,3),strides=(8,8))
In [205]: x
Out[205]:
array([[ 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],
[10, 11, 12],
[11, 12, 13],
[12, 13, 14],
[13, 14, 15],
[14, 15, 16]])
, из которого мы можем выбирать строки до или после получения среднего значения:
In [206]: np.mean(x, axis=1)
Out[206]:
array([ 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12., 13., 14.,
15.])
In [207]: _[[4,9]] # 1 offset from [5,10]
Out[207]: array([ 6., 11.])
Получить правильные параметры для as_strided
немного сложно, требуя хорошего понимания структуры массива. На самом деле это один из самых простых случаев, с массивом 1d и 1-шагом.
Обратите внимание, что я избегаю крайних случаев, когда окно не будет иметь полную ширину.
7 в ширину windows (просто измените форму):
In [211]: x = np.lib.stride_tricks.as_strided(arr, shape=(10,7), strides=(8,8))
In [212]: x
Out[212]:
array([[ 1, 2, 3, 4, 5, 6, 7],
[ 2, 3, 4, 5, 6, 7, 8],
[ 3, 4, 5, 6, 7, 8, 9],
[ 4, 5, 6, 7, 8, 9, 10],
[ 5, 6, 7, 8, 9, 10, 11],
[ 6, 7, 8, 9, 10, 11, 12],
[ 7, 8, 9, 10, 11, 12, 13],
[ 8, 9, 10, 11, 12, 13, 14],
[ 9, 10, 11, 12, 13, 14, 15],
[10, 11, 12, 13, 14, 15, 16]])