递归与渗流

2024-09-27 22:40:03 发布

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

我正在尝试编写一个函数来检查numpy数组中的无向渗透。在这种情况下,当存在某种液体可以遵循的路径时(液体可以向上、向下和侧向流动,但不能沿对角线)发生无向渗流。下面是一个可以提供给我们的数组的示例。在

1 0 1 1 0  
1 0 0 0 1
1 0 1 0 0
1 1 1 0 0
1 0 1 0 1

在这种情况下,渗流的结果如下。在

^{pr2}$

在上面的场景中,液体可能会沿着一条路径流动,除了位置[1,4]和[4,4]中的1之外,所有当前带有1的东西都会重新装满。在

我要写的函数从数组的顶部开始,检查它是否是1。如果它是1,它会将它写入一个新数组。接下来我要它做的是检查刚刚分配的1的上、下、左、右位置。在

我目前的情况如下。在

def flow_from(sites,full,i,j)

    n = len(sites) 

    if j>=0 and j<n and i>=0 and i<n:     #Check to see that value is in array bounds 
        if sites[i,j] == 0: 
            full[i,j] = 0
        else: 
            full[i,j] = 1 
            flow_from(sites, full, i, j + 1)
            flow_from(sites, full, i, j - 1)
            flow_from(sites, full, i + 1, j)
            flow_from(sites, full, i - 1, j) 

在本例中,sites是原始矩阵,例如上面所示的矩阵。新的是被它的流矩阵所取代的矩阵。显示第二个矩阵。i和j用于迭代。在

每当我运行这个程序时,我都会收到一个错误,上面写着“RuntimeError:maximum recursion depth exceeded in comparison”。我仔细研究了这个问题,认为我不需要调整递归限制,但我有一种感觉,我的代码中有一些明显的东西是我看不到的。有什么建议吗?在


Tags: and函数infrom路径numpyif情况
1条回答
网友
1楼 · 发布于 2024-09-27 22:40:03

忘了你的代码块。这是scipy库中已知解决方案的已知问题。从这个answer改编代码,并假设您的数据在一个名为A的数组中。在

from scipy.ndimage import measurements
# Identify the clusters
lw, num = measurements.label(A)
area = measurements.sum(A, lw, index=np.arange(lw.max() + 1))
print A
print area

这样可以得到:

^{pr2}$

也就是说,它为你标记了所有的“簇”,并确定了大小!从这里可以看到,标记为3和4的簇的大小为1,这是您要过滤掉的。这是一种更强大的方法,因为现在您可以过滤任何大小的内容。在

相关问题 更多 >

    热门问题