gpt4 book ai didi

python - 如何在 2D numpy 数组中查找簇大小?

转载 作者:太空狗 更新时间:2023-10-29 20:20:06 25 4
gpt4 key购买 nike

我的问题如下,

我有一个 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 - 如何在 2D numpy 数组中查找簇大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25664682/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com