Pythoncheck 3*3矩阵在9*9矩阵中进行复制,如在数独游戏中

2024-06-26 18:01:25 发布

您现在位置:Python中文网/ 问答频道 /正文

Detect duplicate in each 3*3 block in a 9*9 matrix

我的方法:使用数量和hsplit把9*9分成9 3*3块 并使用.flat函数展平每个3*3块,然后使用set()检查列表是否包含重复项

import numpy as np
def validSolution(board):


    b=np.array(board)
    b=np.vsplit(b,3)
    for n,ar in enumerate(b):
        b[n]=np.hsplit(ar,3)

    for ar in b:
        for arr in ar:
            print(len(set(arr.flat))==len(arr.flat))

validSolution([[5, 3, 4, 6, 7, 8, 9, 1, 2],
               [6, 7, 2, 1, 9, 5, 3, 4, 8],
               [1, 9, 8, 3, 4, 2, 5, 6, 7],
               [8, 5, 9, 7, 6, 1, 4, 2, 3],
               [4, 2, 6, 8, 5, 3, 7, 9, 1],
               [7, 1, 3, 9, 2, 4, 8, 5, 6],
               [9, 6, 1, 5, 3, 7, 2, 8, 4],
               [2, 8, 7, 4, 1, 9, 6, 3, 5],
               [3, 4, 5, 2, 8, 6, 1, 7, 9]])

由于我在python和numpy方面相当缺乏经验,我想寻求一种更有效的方法来完成这项工作。在


Tags: 方法函数innumpyboardfor数量len
1条回答
网友
1楼 · 发布于 2024-06-26 18:01:25

设置:假设a9x9网格,b是您在a中搜索的3x3子矩阵(较小的网格)。在

步骤:

  • 解决这个问题的一种方法是将a重塑为4Da4D形状的(3,3,3,3),这样每个窗口都将沿着第二和第四个轴。

  • 我们需要将b扩展到3D,以便第一个轴与来自a4D的第二个轴对齐,第二个轴与来自{}的第四个轴对齐。

  • 执行比较,这将是一个高效的比较,它提供给我们一个4D布尔数组。沿着这两个维度查找所有匹配项,然后简单地获得匹配索引。

因此,实施-

np.argwhere((a.reshape(3,3,3,3) == b[:,None]).all((1,3)))

样本运行-

^{pr2}$

如果由于某种原因看起来很混乱,而且您更喜欢使用built-ins,那么我们可以使用scikit-image中的^{},以获得形状无关的解决方案-

In [206]: from skimage.util.shape import view_as_blocks

In [207]: np.argwhere((view_as_blocks(a, b.shape) == b).all((2,3)))
Out[207]: array([[0, 0]])

请注意,这些整形都只是views,因此不需要额外的内存空间。虽然比较会导致创建一个与a形状相同的布尔数组,但是作为一个布尔数组,它比int/float数组轻得多(在Linux系统上要轻8倍),因此在内存效率上也不算太差。在

相关问题 更多 >