2012-12-05 22 views
2

我有這樣的代碼:如何將這段代碼從python循環重寫到numpy向量(for perfomance)?

for j in xrange (j_start, self.max_j): 
    for i in xrange (0, self.max_i): 
     new_i = round (i + ((j - j_start) * discriminant)) 
     if new_i >= self.max_i: 
     continue 
     self.grid[new_i, j] = standard[i] 

,我想扔掉緩慢機Python循環,以加快速度。可以使用numpy向量操作,它們非常快。怎麼做?

j_start, self.max_j, self.max_i, discriminant 

int,int,int,float(常量)。

self.grid 

二維numpy數組(self.max_i x self.max_j)。

standard 

一維numpy數組(self.max_i)。

回答

2

這是一個完整的解決方案,也許這將有所幫助。

jrange = np.arange(self.max_j - j_start) 
joffset = np.round(jrange * discriminant).astype(int) 
i = np.arange(self.max_i) 

for j in jrange: 
    new_i = i + joffset[j] 
    in_range = new_i < self.max_i 
    self.grid[new_i[in_range], j+j_start] = standard[i[in_range]] 

向量化這兩個循環也許是可能的,但我認爲這樣做會很棘手。

我還沒有測試過這個,但我相信它會計算出與您的代碼相同的結果。

+0

不幸的是它更復雜:(謝謝你的貢獻,但它並沒有幫助我 –

+0

你在尋找什麼解決方案?一個任何向量化的一般方法是「超出討論的範圍」。 – GaryBishop

+0

我更新瞭解決方案,使其只執行你的代碼(我認爲)。這是否有幫助? – GaryBishop