其他分享
首页 > 其他分享> > 如何在2D numpy数组中查找簇大小?

如何在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