首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将numpy数组的rebin优化为任意二进制大小

将numpy数组的rebin优化为任意二进制大小
EN

Stack Overflow用户
提问于 2016-12-06 12:29:35
回答 2查看 413关注 0票数 1

我是从this问题开始构建的。我正在使用发布在那里的解决方案重新绑定一个numpy数组,并为额外的部分添加一个小的附加项:

代码语言:javascript
运行
复制
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,第一行生成:

代码语言:javascript
运行
复制
array([  2.5,   8.5,  14.5])

第二条将附加如下:

代码语言:javascript
运行
复制
18.5

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

代码语言:javascript
运行
复制
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17]])

第二项是:

代码语言:javascript
运行
复制
array([18, 19])

最后的结果当然是:

代码语言:javascript
运行
复制
array([  2.5,   8.5,  14.5,  18.5])
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-06 13:01:32

方法1 : --如果您关心内存,最好先初始化输出数组,然后分两个步骤给它赋值,就像原始代码中的那样,但不附加值,如下所示-

代码语言:javascript
运行
复制
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内存效率的方法-

代码语言:javascript
运行
复制
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 -

代码语言:javascript
运行
复制
np.bincount(np.arange(x.size)//bin,x)
票数 1
EN

Stack Overflow用户

发布于 2016-12-06 13:18:25

如果你绝对想要一个数组的话,这应该可以用

代码语言:javascript
运行
复制
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)))

但我认为这样做更干净更容易

代码语言:javascript
运行
复制
def rebin(x,bin):
    return np.array([a.mean() for a in np.array_split(x,bin)])

但那不会更快。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40995467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档