2010-08-16 68 views
18

我是NumPy/SciPy的新手。从文档看来,预先分配单个数组而不是调用append/insert/concatenate可以更有效地分配 。什么是预先分配NumPy数组的首选方法?

例如,要加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首选'的方式来做到这一点?

回答

17

在一次调用中预分配mallocs所需的所有内存,同时调整数组大小(通过调用append,insert,concatenate或resize)可能需要将数组复制到更大的内存块中。所以你是正确的,预分配优先于(而且应该快于)调整大小。

根据您要创建的内容,有许多“首选”方法可以预先分配numpy数组。有np.zeros,np.ones,np.empty,np.zeros_like,np.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这种形状相匹配。

相关问题