递归和渗透

时间:2015-11-23 05:44:36

标签: python arrays numpy recursion

我正在尝试编写一个函数来检查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

此场景中的渗透结果如下。

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

在上面的场景中,液体可以沿着一条路径行进,当前1的所有东西都会重新填充,除了位置[1,4]和[4,4]的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) 

在这种情况下,网站是原始矩阵,例如上面显示的矩阵。新的是已用其流量矩阵替换的矩阵。显示第二个矩阵。我和j用于迭代。

每当我运行它时,我都会收到一条错误消息“RuntimeError:相比之下超出了最大递归深度”。我调查了这个并且我认为我不需要调整递归限制,但我觉得我的代码中有一些我看不见的明显的东西。有什么指针吗?

1 个答案:

答案 0 :(得分:0)

忘记你的代码块。这是来自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

这给出了:

[[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]]

[[1 0 2 2 0]
 [1 0 0 0 3]
 [1 0 1 0 0]
 [1 1 1 0 0]
 [1 0 1 0 4]]

[ 0.  9.  2.  1.  1.]

也就是说,它标记了所有&#34;集群&#34;为你确定了大小!从这里你可以看到标记为3和4的簇的大小为1,这是你想要过滤掉的。这是很多更强大的方法,因为现在您可以过滤任何大小。