Python 数组大小为NbyN的窗口内元素的平均值

Python 数组大小为NbyN的窗口内元素的平均值,python,moving-average,Python,Moving Average,目标是获得窗口/内核中元素的平均值 示例案例: x = np.array([[1,2,3,4],[1,2,3,4],[1,2,3,4],[1,2,3,np.nan]]) window size - 2 by 2 ex: overlying window on x sum(x[0,0]+x[0,1]+x[1,0]+x[1,1])/4 = 1.5 >> y array([[ 1.5 , 3.5 ], [ 1.5 , 3.333]]) 尝试过的方法:(I)通过为

目标是获得窗口/内核中元素的平均值

示例案例:

x = np.array([[1,2,3,4],[1,2,3,4],[1,2,3,4],[1,2,3,np.nan]])
window size - 2 by 2
ex: overlying window on x  sum(x[0,0]+x[0,1]+x[1,0]+x[1,1])/4 = 1.5
>> y
array([[ 1.5  ,  3.5  ],
       [ 1.5  ,  3.333]])
尝试过的方法:(I)通过为大小为2,2的窗口硬编码的循环

S,T = x.shape
viArray_at_LR = np.empty([S/2,T/2])
viArray_at_LR[:] = np.nan
rowIncre = 0
for s in range(0,S-1,2):
    colIncre = 0
    for t in range(0,T-1,2):
        try:
            viArray_at_LR[rowIncre,colIncre] = np.nanmean([x[s,t],x[s,t+1],x[s+1,t],x[s+1,t+1]])
        except KeyError:
            print "nan values at ",s,t
        colIncre = colIncre + 1
    rowIncre = rowIncre + 1
II)使用内核,返回与元素的内核跳转相同大小的数组。

import scipy.ndimage as ndimage
out = ndimage.generic_filter(array, np.nanmean, footprint=kernel, mode='wrap')
我希望output array.size为input\u arr.size/window.size


我正在寻找一种通用方法,在这种方法中,任何窗口大小(N,N)都可以不使用循环

,除非您使用CUDA或将要使用循环的东西。此外,任何窗口大小都可能不是一个好主意,因为它的边缘具有未定义的行为。如果使用的窗口大小是数组大小的除数
N
,则可以执行以下操作:

def coarsegrain(x,w=2):
    N = len(x)
    M = N//w
    y = zeros((M,M))
    for i in range(M):
        for j in range(M):
            y[i,j] = np.nanmean(x[w*i:w*i+w,w*j:w*j+w])
    return y
如果你想把索引包起来,你可以像这样使用“花式”索引:

def coarsegrain_wrap(x,w=2):
    N = len(x)
    M = int(ceil(N/w))
    y = zeros((M,M))
    for i in range(M):
        for j in range(M):
            y[i,j] = np.nanmean(numpy.take(x,[list(range(w*i,(w*i+w))),list(range(w*j,(w*j+w)))],mode="wrap"))
    return y

一般来说,我强烈建议使用数组大小的整数除数作为窗口大小。其他任何东西都会生成边界瑕疵。但是,如果数组足够大,则工件就不是什么大问题,可能会被修剪掉。在
列表中包装
范围
仅在Python3中是必需的。

您想要相同大小的数组还是将其缩小为窗口大小^2的一个因子?@mmdanziger,我想要缩小它谢谢!!!这对我有用。我不确定内核是否能达到这一目标,所以我在so上发了帖子。