2012-07-17 120 views
3

我想使用inntermost for循環(迭代3次)來實現下面的代碼片段,因爲這會花費很多時間。在Python中減少循環

for i in arange(r): 
    for j in arange(c):  
     for k in arange(3): 
      if m[i,j]==n[i,j,k]: 
       new[i,j]=old[i,j,k] 

任何人都可以提出一個更好的方法嗎?

回答

2

看看使用itertools.product - 從未與numpy的陣列中使用它,但它可能只是工作(不明白爲什麼不能)

for i, j, k in itertools.product(arange(r), arange(c), arange(3)): 
    if m[i,j]==n[i,j,k]: 
     new[i,j]=old[i,j,k] 
+1

爲什麼不這樣做的主要原因是這會影響Python中的大部分工作。至少在考慮性能時,一個純粹的解決方案是可取的。而一個純粹的解決方案並不難。 – senderle 2012-07-17 15:45:18

+0

@senderle夠公平 - 我必須承認解決從字面上減少「for循環」的問題。我可以看到正確使用numpy數組是一個更好的選擇。 – 2012-07-17 15:46:40

+0

公平的說,在許多情況下這是正確的解決方案:) - 當所討論的對象是「numpy」對象時可能不會。 – senderle 2012-07-17 15:47:38

5
for k in range(3): 
    ind = m == n[:,:,k] 
    new[ind] = old[:,:,k][ind] 
-1

由於arange(c)計算每個i,並arange(3)對於每對夫婦(i, j),計算它們一勞永逸外循環可以節省一些時間:

range_j = arange(c) 
range_3 = arange(3) 
for i in arange(r): 
    for j in range_j:  
     for k in range_3: 
      if m[i,j]==n[i,j,k]: 
       new[i,j]=old[i,j,k] 

有限公司這僅僅是有效的,因爲這些範圍獨立於ij