首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何统计python数组中独立区域的个数

如何统计python数组中独立区域的个数
EN

Stack Overflow用户
提问于 2018-06-01 06:28:04
回答 1查看 875关注 0票数 -2

我需要计算数组中独立区域的数量。

下面是一个数组示例。我可以计算唯一字符串的数量,但是如果有两个不同的岛,比如在下面的网格中,64733在左上角和右下角,我的函数不会正确地计算区域的数量。如果其中两个区域由相同的数字组成,谁能帮助我找到一种计算区域数量的方法?我正在用python2.x编写。

代码语言:javascript
复制
|64733|20996|92360|92360|04478|04478|04478|04478|04478|98101
|64733|92360|92360|92360|04478|04478|04478|04478|04478|04478
|64733|92360|29136|92360|04478|04478|04478|04478|04478|04478
|64733|92360|29136|92360|04478|04478|04478|04478|04478|04478
|92360|92360|92360|92360|04478|04478|04478|04478|04478|04478
|04478|04478|04478|04478|04478|04478|04478|04478|04478|04478
|04478|04478|04478|04478|04478|04478|04478|04478|04478|04478
|04478|04478|04478|04478|04478|04478|04478|04478|04478|04478
|04478|04478|04478|04478|04478|04478|04478|04478|04478|64773
|04478|04478|04478|04478|04478|04478|04478|04478|64773|64773

输入是一个3d数组,如下所示

代码语言:javascript
复制
[[['6', '4', '7', '3', '3'],
  ['2', '0', '9', '9', '6'],
  ['9', '2', '3', '6', '0'],
  ['9', '2', '3', '6', '0'],
  ['0', '4', '4', '7', '8'],
  ['0', '4', '4', '7', '8'],
  ['0', '4', '4', '7', '8'],
  ['0', '4', '4', '7', '8'],
  ['0', '4', '4', '7', '8'],
  ['9', '8', '1', '0', '1']],
 [['6', '4', '7', '3', '3'],
  ['9', '2', '3', '6', '0'],
  ['9', '2', '3', '6', '0'],
  ['9', '2', '3', '6', '0'],
  ['0', '4', '4', '7', '8'],
  ['0', '4', '4', '7', '8'],
  ['0', '4', '4', '7', '8'],
  ['0', '4', '4', '7', '8'],
  ['0', '4', '4', '7', '8'],
  ['0', '4', '4', '7', '8']],
 [['6', '4', '7', '3', '3'],
  ['9', '2', '3', '6', '0'],

这不是完整的输入(因为它很庞大),但我认为它已经理解了要点

因此将是任何唯一的数字符号字符串所在的位置,以及相同的相邻字符串的总数(相邻的是向上、向下、向左、向右,而不是对角线)。

代码语言:javascript
复制
enter code here
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-01 07:17:14

您没有发布完整的数组,所以我对您给我们的原始pip分隔值做了一些假设。这是我用Python3编写的,但我认为它在Python2中应该可以工作,只需修改对语句的print函数调用即可。

代码语言:javascript
复制
arr = [["64733","20996","92360","92360","04478","04478","04478","04478","04478","98101"],
["64733","92360","92360","92360","04478","04478","04478","04478","04478","04478"],
["64733","92360","29136","92360","04478","04478","04478","04478","04478","04478"],
["64733","92360","29136","92360","04478","04478","04478","04478","04478","04478"],
["92360","92360","92360","92360","04478","04478","04478","04478","04478","04478"],
["04478","04478","04478","04478","04478","04478","04478","04478","04478","04478"],
["04478","04478","04478","04478","04478","04478","04478","04478","04478","04478"],
["04478","04478","04478","04478","04478","04478","04478","04478","04478","04478"],
["04478","04478","04478","04478","04478","04478","04478","04478","04478","64773"],
["04478","04478","04478","04478","04478","04478","04478","04478","64773","64773"]]

x = len(arr)
y = len(arr[0])

#create a new array the same size as the original
regions = [[None for _ in range(y)] for _ in range(x)]

print(regions)

label = 0
queue = []

def check_neighbor(i, j, v):
    if not regions[i][j] and arr[i][j] == v:
        regions[i][j] = label
        queue.insert(0, (i, j))

for i in range(x):
    for j in range(y):
        #don't check an already labelled region
        if regions[i][j]: continue
        label += 1 #new label
        regions[i][j] = label
        queue = [(i, j)]
        v = arr[i][j]
        #keep checking neighbours until we run out
        while queue:
            (X, Y) = queue.pop()
            if X > 0:
                check_neighbor(X-1, Y, v)
            if X < x-1:
                check_neighbor(X+1, Y, v)
            if Y > 0:
                check_neighbor(X, Y-1, v)
            if Y < y-1:
                check_neighbor(X, Y+1, v)

print(regions)
print(label) # this is the number of regions
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50633660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档