Numpy:多维数组的真值比较

4

我正在编写一个数独求解器,使用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个回答

3
我认为你想要进行以下检查:

我认为下面是您想要进行的检查:

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

如果所有单元格都已分配值 (puzzle) 或至少有一个非零条目在 solving 中 (np.any(solving, axis=-1)),则此代码将返回 True


太棒了!而且如此简单 :) 我想我并没有真正理解np.all()和np.any()的作用。谢谢! - Epimetheus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接