我有一个 2D 的 numpy 数组(6 行 6 列),我想要创建另一个 2D 数组,其中每个块是在一个块大小窗口内所有元素的平均值。目前,我有以下代码:
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)
有没有办法让它更符合Python语言特性?或者说numpy已经有类似的功能了吗?
更新
根据M. Massias的解决方案,这是一个使用变量替换固定值的更新。不确定是否编码正确,但似乎可以工作:
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))