2015-05-03 59 views
2

我有一些代碼設置,需要檢查很多不同的情況,比如:如何有效檢查多個條件並在其中分配不同的ID?

cond = np.zeros_like(matrix1) 
ids = np.where(matrix1 == value1) 
cond[ids] = 1 
ids2 = np.where(matrix2 == value2) 
cond[ids2] = 2 

... 

idsn = np.where(matrixn == valuen) 
cond[idsn] = n 

我不知道是否有這樣做的更簡單的方法。一般來說,條件彼此不相關。我應該提到一些矩陣可能被重用(即條件5正在檢查矩陣2的某些事物),並且一些條件可能比「矩陣等於數字」更復雜。我正在尋找類似的東西:

for j, condition in enumerate(condition_list): 
    ids = np.where(condition) 
    cond[ids] = j 
+0

我不確定我是否理解您提出的解決方案會出現什麼問題。你想要更優雅或靈活的東西嗎?對於不同的對象類型可能健壯? –

+0

列表中的矩陣和值是什麼?如果不是,我建議你把它們放在一個。 – pzp

+0

@ zom-pro,我絕對尋找更優雅的東西。現在,這佔用了大約40行代碼,看起來很難看,而且之前我發現了一個錯字,因爲我錯誤地輸入了其中一個條件。 –

回答

2

爲了保持整潔,您可以創建一個條件字典。

def eval_equal(a, b): 
    return a == b 

def eval_different(a, b): 
    return a != b 

def eval_combination(a, b): 
    eval_equal(a, b) and eval_different(a, b) 

evaluator = {} 
evaluator['cond1'] = eval_equal 
evaluator['cond2'] = eval_different 
evaluator['cond3'] = eval_combination 

my_matrix = [[1, 2, 3], [1, 2, 3]] 
vector = [1, 2, 3] 
conds = [] 
for cond, eval_func in evaluator.items(): 
    if eval_func(my_matrix, vector): 
     conds.append(cond) 

print(conds) 

然後,@pzp說,你可以創建對象的列表進行評估,並餵它們將通過所有的條件下運行的字典。此外,它允許您結合簡單的條件(或更復雜的像> 10 + b),因爲它們都是功能。

相關問題