我正在尝试编写一个函数来检查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:相比之下超出了最大递归深度”。我调查了这个并且我认为我不需要调整递归限制,但我觉得我的代码中有一些我看不见的明显的东西。有什么指针吗?
答案 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,这是你想要过滤掉的。这是很多更强大的方法,因为现在您可以过滤任何大小。