【发布时间】:2014-10-29 03:44:46
【问题描述】:
我的问题如下,
我有一个用 0 和 1 填充的 2D numpy 数组,具有吸收边界条件(所有外部元素都是 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。
这不起作用,我看不到错误在哪里......
我想知道是否有更简单的方法。
【问题讨论】:
标签: python arrays numpy block cluster-analysis