python - 查找Python列表中的所有矩形

标签 python arrays algorithm list 2d

我有一个 python 列表:

[
[1, 1, 2],
[1, 1, 2],
[7, 4, 5],
[5, 3, 7],
]

我需要找到这个二维数组中满足此条件的所有矩形(有多少个矩形):
1. 一个矩形内的所有数字必须相同
2. 该矩形中的数字不能位于数组中的其他位置
3. 并不是真正的标准,而是一些额外的信息:
矩形尺寸可以是 1x1、2x1、2x2、3x1、3x2、3x3、3x4 等。

在此示例中,有 5 个数字矩形:

1, 2, 3, 4

数字 3、1、8 不符合条件,因为:

5 - 违反规则 2
7 - 违反规则 2

我尝试过类似查找最近的元素来比较它们,如果它们匹配则向下一行等等,但我无法做到这一点,所以我希望有人可以提供帮助。谢谢。

最佳答案

一种方法是对于每个唯一值,在该值的所有实例上拟合一个矩形。如果该矩形内的所有值都匹配,则您已满足标准。这里使用 numpy 在代码中实现,打印符合条件的值:

import numpy as np

arr = np.array([
    [3, 2, 2, 1, 4],
    [3, 2, 2, 7, 4],
    [8, 2, 2, 1, 3],
    [8, 8, 9, 9, 9],
    [8, 8, 1, 5, 1]
])
for n in np.unique(arr):
    y, x = np.where(arr == n)
    if (arr[y.min():y.max()+1, x.min():x.max()+1] == n).all():
        print(n)

更新

不太漂亮,但这样的东西不需要 numpy:

lst = [
    [3, 2, 2, 1, 4],
    [3, 2, 2, 7, 4],
    [8, 2, 2, 1, 3],
    [8, 8, 9, 9, 9],
    [8, 8, 1, 5, 1]
]

for val in set([x for sub in lst for x in sub ]):
    y = [n for n, sub in enumerate(lst) if val in sub]
    if any(y):
        x = []
        for sub in [lst[n] for n in y]:
            x.extend([m for m, v in enumerate(sub) if v == val])

        rect = [i for sub in lst[min(y):max(y)+1] for i in sub[min(x):max(x)+1]]
        if all([i == val for i in rect]):
            print(val)

关于python - 查找Python列表中的所有矩形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54385114/

相关文章:

c - 为什么运行此代码时会出现运行时错误?

python - 子进程用列表和 shell=True 做什么

python - 如何在 jython 中使用 gtk/pywebkitgtk?

arrays - shell中输入的数字

javascript - 如何从 JavaScript 数组中获取值?

algorithm - 将相等的矩形拟合到更大的矩形中

在巨大的完整图中找到 MST 的算法

python - 让 DQN 学习 CartPole-v1 (PyTorch) 时出现问题

python - 将 rpy2 与 numpy.testing 一起使用时出现 ImportError

javascript - 我为什么要使用 Array.toSource?