Promedio de computación para matriz numpy

Tengo un 2d numpy array (6 x 6) elementos. Quiero crear otra matriz 2D a partir de ella, donde cada bloque es el promedio de todos los elementos dentro de una ventana de tamaño de bloque. Actualmente, tengo el foll. código:

import os, numpy def avg_func(data, blocksize = 2): # Takes data, and averages all positive (only numerical) numbers in blocks dimensions = data.shape height = int(numpy.floor(dimensions[0]/blocksize)) width = int(numpy.floor(dimensions[1]/blocksize)) averaged = numpy.zeros((height, width)) for i in range(0, height): print i*1.0/height for j in range(0, width): block = data[i*blocksize:(i+1)*blocksize,j*blocksize:(j+1)*blocksize] if block.any(): averaged[i][j] = numpy.average(block[block>0]) return averaged arr = numpy.random.random((6,6)) avgd = avg_func(arr, 3) 

¿Hay alguna manera en que pueda hacerlo más python? ¿Tal vez ya tiene algo que lo adormece?

ACTUALIZAR

Basado en la solución de M. Massias a continuación, aquí hay una actualización con valores fijos reemplazados por variables. No estoy seguro si está bien codificado. Aunque parece funcionar:

 dimensions = data.shape height = int(numpy.floor(dimensions[0]/block_size)) width = int(numpy.floor(dimensions[1]/block_size)) t = data.reshape([height, block_size, width, block_size]) avrgd = numpy.mean(t, axis=(1, 3)) 

Para calcular algunos segmentos de operación en número, es muy útil cambiar la forma de su matriz y usar ejes adicionales.

Para explicar el proceso que usaremos aquí: puede cambiar la forma de su matriz, tomar la media, volver a darle forma y volver a usar la media. Aquí supongo que el tamaño de bloque es 2

 t = np.array([[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5],[0, 1, 2, 3, 4, 5],[0, 1, 2, 3, 4, 5],[0, 1, 2, 3, 4, 5],[0, 1, 2, 3, 4, 5],]) t = t.reshape([6, 3, 2]) t = np.mean(t, axis=2) t = t.reshape([3, 2, 3]) np.mean(t, axis=1) 

salidas

 array([[ 0.5, 2.5, 4.5], [ 0.5, 2.5, 4.5], [ 0.5, 2.5, 4.5]]) 

Ahora que está claro cómo funciona esto, puedes hacerlo en una sola pasada:

 t = t.reshape([3, 2, 3, 2]) np.mean(t, axis=(1, 3)) 

También funciona (y debería ser más rápido, ya que los medios se calculan solo una vez, supongo). Te permitiré sustituir height/blocksize , width/blocksize y blocksize consecuencia.

Ver @askewcan buen comentario sobre cómo generalizar esto a cualquier dimensión.