如何在2D numpy数组中查找簇大小?
作者:互联网
我的问题如下,
我有一个2D numpy数组填充0和1,具有吸收边界条件(所有外部元素都是0),例如:
[[0 0 0 0 0 0 0 0 0 0]
[0 0 1 0 0 0 0 0 0 0]
[0 0 1 0 1 0 0 0 1 0]
[0 0 0 0 0 0 1 0 1 0]
[0 0 0 0 0 0 1 0 0 0]
[0 0 0 0 1 0 1 0 0 0]
[0 0 0 0 0 1 1 0 0 0]
[0 0 0 1 0 1 0 0 0 0]
[0 0 0 0 1 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0]]
我想创建一个函数,将此数组及其线性维L作为输入参数(在本例中为L = 10),并返回此数组的簇大小列表.
“簇”是指阵列中元素1的孤立组
如果数组元素[i] [j]的所有邻居都是零,则它是孤立的,并且它的邻居是元素:
[i+1][j]
[i-1][j]
[i][j+1]
[i][j-1]
所以在之前的数组中我们有7个大小的簇(2,1,2,6,1,1,1)
我试图通过创建两个函数来完成这个任务,第一个是递归函数:
def clust_size(array,i,j):
count = 0
if array[i][j] == 1:
array[i][j] = 0
if array[i-1][j] == 1:
count += 1
array[i-1][j] = 0
clust_size(array,i-1,j)
elif array[i][j-1] == 1:
count += 1
array[i-1][j] = 0
clust_size(array,i,j-1)
elif array[i+1][j] == 1:
count += 1
array[i-1][j] = 0
clust_size(array,i+1,j)
elif array[i][j+1] == 1:
count += 1
array[i-1][j] = 0
clust_size(array,i,j+1)
return count+1
它应该返回一个集群的大小.每次函数找到一个等于1的数组元素时,它会增加计数器“count”的值,并将元素的值更改为0,这样每个“1”元素只计算一次.
如果该元素的一个邻居等于1,则该函数在该元素上调用自身.
第二个功能是:
def clust_list(array,L):
sizes_list = []
for i in range(1,L-1):
for i in range(1,L-1):
count = clust_size(array,i,j)
sizes_list.append(count)
return sizes_list
它应该返回包含簇大小的列表. for循环从1迭代到L-1,因为所有外部元素都是0.
这不起作用,我看不出错误在哪里……
我想知道是否有更简单的方法来做到这一点.
解决方法:
这似乎是一个渗透问题.
如果你安装了scipy,以下链接有你的答案.
http://dragly.org/2013/03/25/working-with-percolation-clusters-in-python/
from pylab import *
from scipy.ndimage import measurements
z2 = array([[0,0,0,0,0,0,0,0,0,0],
[0,0,1,0,0,0,0,0,0,0],
[0,0,1,0,1,0,0,0,1,0],
[0,0,0,0,0,0,1,0,1,0],
[0,0,0,0,0,0,1,0,0,0],
[0,0,0,0,1,0,1,0,0,0],
[0,0,0,0,0,1,1,0,0,0],
[0,0,0,1,0,1,0,0,0,0],
[0,0,0,0,1,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0]])
这将识别集群:
lw, num = measurements.label(z2)
print lw
array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 2, 0, 0, 0, 3, 0],
[0, 0, 0, 0, 0, 0, 4, 0, 3, 0],
[0, 0, 0, 0, 0, 0, 4, 0, 0, 0],
[0, 0, 0, 0, 5, 0, 4, 0, 0, 0],
[0, 0, 0, 0, 0, 4, 4, 0, 0, 0],
[0, 0, 0, 6, 0, 4, 0, 0, 0, 0],
[0, 0, 0, 0, 7, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])
以下将计算他们的面积.
area = measurements.sum(z2, lw, index=arange(lw.max() + 1))
print area
[ 0. 2. 1. 2. 6. 1. 1. 1.]
这给出了你的期望,虽然我认为你会有一个由8个成员通过眼睛渗透的集群.
标签:python,arrays,numpy,cluster-analysis,block 来源: https://codeday.me/bug/20191007/1868867.html