2014-01-21 3 views
3

Итак, я пишу sudoku solver, используя массив 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)] 

Это возвратило п х 9 массива, где п количество пустых квадратов в моей головоломке. Я хочу, чтобы функция возвращала значение False, если какое-либо из п массивов с формой 1x9 точно равно

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), или (|), по крайней мере, ненулевую запись в solving (np.any(solving, axis=-1)).

+0

Блестящий! И так просто :) Я думаю, что не понял, что делают np.all() и np.any(). Спасибо! – Epimetheus

Смежные вопросы