我想使用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]
任何人都可以提出一個更好的方法嗎?
我想使用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]
任何人都可以提出一個更好的方法嗎?
看看使用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]
for k in range(3):
ind = m == n[:,:,k]
new[ind] = old[:,:,k][ind]
由於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]
有限公司這僅僅是有效的,因爲這些範圍獨立於i
和j
。
爲什麼不這樣做的主要原因是這會影響Python中的大部分工作。至少在考慮性能時,一個純粹的解決方案是可取的。而一個純粹的解決方案並不難。 – senderle 2012-07-17 15:45:18
@senderle夠公平 - 我必須承認解決從字面上減少「for循環」的問題。我可以看到正確使用numpy數組是一個更好的選擇。 – 2012-07-17 15:46:40
公平的說,在許多情況下這是正確的解決方案:) - 當所討論的對象是「numpy」對象時可能不會。 – senderle 2012-07-17 15:47:38