Numpy:多维数组的真实比较

时间:2014-01-21 21:02:50

标签: python arrays numpy multidimensional-array sudoku

所以我正在编写一个数独求解器,使用9x9数组作为网格,使用9x9x9数组作为其可能性。由于我使用的回溯算法,我必须检查数独是否仍然有效,又名:

如果某个字段不包含数字并且没有剩余可能性,则返回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 x 9数组,其中n是我拼图中空方块的数量。如果形状为1x9的n个数组中的任何一个完全等于

,我希望函数返回False
    array([0,0,0,0,0,0,0,0,0], dtype = int8)

但是,我在各种尝试中都没有取得任何成功,包括.any()和.all()实验。这是我使用的最新代码:

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

...总是返回False。编码的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

我认为以下是您要做的检查:

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

如果所有单元格的值已分配(True),或(puzzle)在|中至少包含非零条目,则会返回solving({1}} {1}})。