2010-08-16 45 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這種形狀相匹配。

相關問題