优化numpy数组的rebin到任意binsize

时间:2016-12-06 12:29:35

标签: python arrays numpy

我正在建立this问题。我正在使用在那里发布的解决方案重新整理一个numpy数组,只需要额外的一小部分:

from numpy import arange,append

x = arange(20)
x = x[:(x.shape[0]/bin)*bin].reshape((x.shape[0]//bin,-1)).mean(1)
x=  append(x,x[(x.shape[0]/bin)*bin:].mean())

这是为了处理x.shape[0]的非除数箱。 append添加剩余单元格的平均值。问题是我在这里制作了很多数组,并且超出了内存的运行效率。有没有更好的办法?我甚至考虑转移到列表,重新分箱,最后使用数组(结果)并返回。

要明确bin=6,第一行产生:

array([  2.5,   8.5,  14.5])

,第二个将附加:

18.5

mean运算符之前,生成的矩阵为:

array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17]])

和第二个:

array([18, 19])

最终结果当然是:

array([  2.5,   8.5,  14.5,  18.5])

2 个答案:

答案 0 :(得分:2)

如果您绝对需要一个数组

,我认为这应该可行
def rebin(x,bin):
    x_pad=np.lib.pad(x,(0,bin-x.size%bin), 'constant').reshape(bin,-1)
    return np.hstack((np.mean(x_pad, axis=1)[:-1],np.sum(x_pad[-1])/(x.size%bin)))

但我认为这样做更清洁,更容易

def rebin(x,bin):
    return np.array([a.mean() for a in np.array_split(x,bin)])

但那不会更快。

答案 1 :(得分:1)

方法#1:如果您关心内存,最好初始化输出数组,然后分两步将值分配给它,就像在原始代码中一样但没有附加,就像这样 -

n = x.size//bin
out = np.empty((x.size-1 + bin)//bin) 
out[:n] = x[:bin*n].reshape(-1,bin).mean(1)
out[n:] = x[-x.size+n*bin:].mean()

方法#2:这是另一种专注于内存效率的方法np.add.reduceat -

out = np.add.reduceat(x, bin*np.arange((x.size-1+bin)//bin)).astype(float)
out[:n] /= bin
out[n:] /= x.size - n*bin 

或者,使用np.add.reduceat()获取分组摘要的另一种方法是使用np.bincount -

np.bincount(np.arange(x.size)//bin,x)