我的问题如下,
我有一个二维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。
这不起作用,我看不出错误在哪里...
我想知道是否有更简单的方法可以完成它。