繁体   English   中英

计算二维数组中的出现次数

[英]Count Number Of Occurence in 2D Array

假设我有一个这样的数组

grid: 
    [[1, 1, 0, 0, 0],
    [1, 1, 0, 0, 0],
    [0, 0, 1, 0, 0],
    [0, 0, 0, 1, 1]]

我想在这种情况下隔离“项目”组 1 是三个组,规则是 0 用于将它们像交叉点一样分开。 所以这个例子有 3 组 1。

如果您知道如何使用 python 执行此操作,那么我会被问到的第一个问题是我尝试过什么作为没有将作业交给社区的证据,我的想法是向下迭代并离开,但这会有一个遗漏一些数字的可能性很高,因为如果您考虑一下,它会形成一个从左上角发出的十字架,而这组是在这里学习的。 因此,对于我和其他对此类数据科学感兴趣的问题,请考虑周到。

如果您不需要知道哪些集合是重复的,则可以使用 python 的内置set来确定列表中的唯一项。 这可能有点棘手,因为set不适用于listlist 但是,您可以将其转换为tuplelist ,将它们放回list ,然后获取该列表的len以找出有多少唯一值集。

grid = [[1, 1, 0, 0, 0],
        [1, 1, 0, 0, 0],
        [0, 0, 1, 0, 0],
        [0, 0, 0, 1, 1]]

unique = [list(x) for x in set(tuple(x) for x in grid)]

unique_count = len(unique)  # this will return 3

相对简单的基于深度优先搜索的连通分量标记实现。

def get_components(grid, indicator=1):
    def label(g, row, col, group):
        if row >= 0 and col >= 0 and row < len(g) and col < len(g[row]) and g[row][col] == -1:
            # only label if currently unlabeled
            g[row][col] = group
            # attempt to label neighbors with same label
            label(g, row + 1, col, group)
            label(g, row, col + 1, group)
            label(g, row - 1, col, group)
            label(g, row, col - 1, group)
            return True
        else:
            return False

    # initialize label grid as -1 for entries that need labeled
    label_grid = [[-1 if gc == indicator else 0 for gc in gr] for gr in grid]
    group_count = 0
    for row, grid_row in enumerate(grid):
        for col in range(len(grid_row)):
            if label(label_grid, row, col, group_count + 1):
                group_count += 1
    return label_grid, group_count

label_grid, group_count = get_components(grid)示例输入的结果是

label_grid = [[1, 1, 0, 0, 0],
              [1, 1, 0, 0, 0],
              [0, 0, 2, 0, 0],
              [0, 0, 0, 3, 3]]
group_count = 3

对于以下情况

grid = [[1 0 1],
        [1 1 1]]

我们得到group_count = 1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM