Простейший метод numpy only, который делает гораздо меньше работы с этой сверткой и, следовательно, скорее всего быстрее, чем методы на основе файлов, - это изменить размер исходного массива на один с дополнительными измерениями, а затем уменьшить его до нормального значения, суммируя его новые размеры:
>>> arr = np.arange(108).reshape(9, 12)
>>> rows, cols = arr.shape
>>> arr.reshape(rows//3, 3, cols//3, 3).sum(axis=(1, 3))
array([[117, 144, 171, 198],
[441, 468, 495, 522],
[765, 792, 819, 846]])
Если вы хотите, среднее, вы бы просто разделить полученный массив по количеству элементов:
>>> arr.reshape(rows//3, 3, cols//3, 3).sum(axis=(1, 3))/9
array([[ 13., 16., 19., 22.],
[ 49., 52., 55., 58.],
[ 85., 88., 91., 94.]])
Этот метод работает только если массив имеет форму, которая сама по себе несколько 3.
scipy.misc.imresize (arr, size, interp = 'bilinear', mode = None) – zenpoy