【问题标题】:Recursion and Percolation递归和渗透
【发布时间】:2016-02-25 04:02:25
【问题描述】:

我正在尝试编写一个函数来检查 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,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:比较中超出了最大递归深度”。我调查了这个,我认为我不需要调整我的递归限制,但我觉得我的代码有一些明显的东西我只是看不到。任何指针?

【问题讨论】:

  • 我猜你不止一次访问单元格,所以你进入了一个无限循环。

标签: python arrays numpy recursion


【解决方案1】:

忘记了您的代码块。这是 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.]

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多