【问题标题】:Numpy: Truth comparison of multidimensional arraysNumpy:多维数组的真值比较
【发布时间】:2014-01-21 21:02:49
【问题描述】:

所以我正在编写一个数独求解器,它使用一个 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。编写此代码的正确方法是什么?

【问题讨论】:

    标签: python arrays numpy multidimensional-array sudoku


    【解决方案1】:

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

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

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

    【讨论】:

    • 太棒了!如此简单:) 我想我并不真正理解 np.all() 和 np.any() 的作用。谢谢!
    猜你喜欢
    • 2012-11-24
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 2021-12-08
    • 2021-07-24
    • 1970-01-01
    • 2013-01-17
    相关资源
    最近更新 更多