首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >预分配NumPy阵列的首选方法是什么?

预分配NumPy阵列的首选方法是什么?
EN

Stack Overflow用户
提问于 2010-08-16 17:02:48
回答 2查看 28.3K关注 0票数 27

我是第一次接触NumPy/SciPy。从文档中看,预分配单个数组似乎比调用append/insert/concatenate更有效。

例如,要将一列1添加到数组中,我认为如下所示:

ar0 = np.linspace(10, 20, 16).reshape(4, 4)
ar0[:,-1] = np.ones_like(ar0[:,0])

而不是这样:

ar0 = np.linspace(10, 20, 12).reshape(4, 3)
ar0 = np.insert(ar0, ar0.shape[1], np.ones_like(ar0[:,0]), axis=1)

我的第一个问题是这是否正确(第一个更好),第二个问题是,目前我只是像这样预分配数组(我在SciPy站点上的几个Cookbook示例中注意到了这一点):

np.zeros((8,5))

什么是“NumPy首选”的方式呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-08-16 19:10:39

预分配错误地在一次调用中占用了您需要的所有内存,而调整数组大小(通过调用append、insert、concatenate或resize)可能需要将数组复制到更大的内存块。所以你是对的,预分配比调整大小更可取(而且应该比它更快)。

根据您想要创建的内容,有许多“首选”方法可以预先分配numpy数组。有np.zerosnp.onesnp.emptynp.zeros_likenp.ones_likenp.empty_like以及其他许多创建有用数组的工具,比如np.linspacenp.arange

所以

ar0 = np.linspace(10, 20, 16).reshape(4, 4)

如果这最接近你想要的ar0,那就好了。

然而,为了使最后一列都是1,我认为更好的方法是直接说

ar0[:,-1]=1

由于ar0[:,-1]的形状为(4,),因此1为broadcasted以匹配此形状。

票数 25
EN

Stack Overflow用户

发布于 2020-11-26 18:54:09

根据我的经验,numpy.empty()是预分配大型数组的最快方法。我讨论的数组具有(80,80,300000)和dtype uint8的形状。

代码如下:

%timeit  np.empty((80,80,300000),dtype='uint8')
%timeit  np.zeros((80,80,300000),dtype='uint8')
%timeit  np.ones((80,80,300000),dtype='uint8')

以及计时的结果:

10000 loops, best of 3: 83.7 µs per loop  #Too much faster
1 loop, best of 3: 273 ms per loop
1 loop, best of 3: 272 ms per loop
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3491802

复制
相关文章

相似问题

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