2014-01-21 130 views
3

所以我寫了一個數獨求解器,它使用9x9陣列作爲網格,9x9x9陣列作爲它的可能性。由於我正在使用的回溯算法,我必須檢查數獨是否仍然有效,又名:Numpy:多維數組的真值比較

如果有一個字段不包含數字並且沒有剩餘可能性,則返回False。 到目前爲止我實施瞭如下:

for j in range(9): 
     for i in range(9): 
      if puzzle[j,i] == 0 and (solving[j,i] == 0).sum() == 9: 
       return False 
    return True 

如果在正方形(J,I)含有,例如,選項2,圖3和圖7所示,根據可能性陣列將是:

solving[j,i] = array([0, 2, 3, 0, 0, 0, 7, 0, 0], dtype = int8) 

我試圖避免在這裏和我的求職者其他地方這樣的循環。我試着如下:

solving[where(puzzle == 0)] 

這返回一個n×9數組,其中n是我的拼圖中空方塊的數量。我希望函數返回false,如果任何與形狀1X9 n個陣列正好等於

array([0,0,0,0,0,0,0,0,0], dtype = int8) 

但是,我沒有與各種嘗試,包括.ANY()和。所有()的實驗沒有成功。這是我使用的最新代碼:

def is_valid(self, puzzle, solving): 
     if (solving[py.where(puzzle == 0)].all() == 0).sum() > 0: 
      return False 
     return True 

...總是返回False。對此進行編碼的正確方法是什麼?

回答

2

我認爲下面是你想要做的檢查:

np.all(puzzle | np.any(solving, axis=-1) 

這將返回True如果所有的細胞要麼分配(puzzle)(|)的值,或者至少有一個非零項在solvingnp.any(solving, axis=-1))。

+0

太棒了!太簡單了:)我想我並不真正瞭解np.all()和np.any()是做什麼的。謝謝! – Epimetheus