我正在建立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])
答案 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)