我是从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])
发布于 2016-12-06 13:01:32
方法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)
发布于 2016-12-06 13:18:25
如果你绝对想要一个数组的话,这应该可以用
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)])
但那不会更快。
https://stackoverflow.com/questions/40995467
复制相似问题