2014-02-24 70 views
0

我建立像這樣的列表:使用列表元組作爲2D指數遍歷另一個2D名單

NUM_ROWS和num的cols與列表AAA

for i in range(num_rows): 
    for j in range(num_cols): 
     if (aaa[i][j] == 0): 
       bbb.append((i,j)) 
    pass 
pass 

現在我還有一個叫CCC與2D列表浮動英寸我想使用從bbb的元組作爲ccc(特定的行和列)的索引。我需要在特定索引之後做一個np.sum。所以我試過這樣的事情:

np.sum(ccc[k][l] for (k,l) in bbb) 

我是新來的蟒蛇,我知道這是不對的。我幾乎沒有學會如何編寫循環...但是有沒有辦法做這樣的事情?

謝謝大家。

+0

我不知道這意味着什麼,但看起來它會忽略我所需要的條件:在AAA需要整數爲0?你能解釋一下嗎? – user3332241

回答

0

如果兩個aaaccc是numpy的陣列,使用np.sum(ccc[aaa == 0])

>>> import numpy as np 
>>> 
>>> aaa = np.array([ 
...  [1, 0, 1], 
...  [0, 1, 0], 
...  [1, 0, 1], 
... ]) 
>>> ccc = np.array([ 
...  [1, 2, 3], 
...  [4, 5, 6], 
...  [7, 8, 9], 
... ]) 

>>> aaa == 0 
array([[False, True, False], 
     [ True, False, True], 
     [False, True, False]], dtype=bool) 

>>> ccc[aaa == 0] 
array([2, 4, 6, 8]) 

>>> np.sum(ccc[aaa == 0]) 
20 
+0

不應''='是'=='? – user2357112

+0

@ user2357112,你說得對。我在發佈答案後才發現它。感謝您的評論。 – falsetru

+0

謝謝你的回覆,我試過這個方法,但是我得到了一個索引錯誤:索引20超出了大小爲20的軸0的邊界。這是因爲我的aaa和ccc有不同的大小。有沒有辦法來解決這個問題? – user3332241

0

使用常規sumnp.sum期待一個類似數組的對象:

sum(ccc[k][l] for (k,l) in bbb) 

請注意,如果你使用NumPy的,你可能不應該使用所有這些列表和非NumPy的操作中。這裏是你的代碼將會是什麼樣aaaccc爲NumPy的數組:

ccc[aaa==0].sum() 

更少的代碼,並且運行速度比基於列表的解決方案快得多。

附加說明:您不需要使用pass結束循環。

+0

謝謝你的回覆,我試過這個方法,但是我得到了一個索引錯誤:索引20超出了大小爲20的軸0的邊界。這是因爲我的aaa和ccc有不同的大小。有沒有辦法來解決這個問題? – user3332241

+0

@ user3332241:如果aaa和ccc應該有不同的大小,你的程序可能有一個基本的設計缺陷。如果它們不應該具有不同的大小,則可能會在創建它們的代碼中存在一個錯誤。我不知道該修復應該是什麼。 – user2357112

+0

你是對的,這是一個錯誤。現在解決了:D謝謝 – user3332241