Python numpy 2d布尔数组计数连续真实大小

Python numpy 2d布尔数组计数连续真实大小,python,numpy,boolean,flood-fill,Python,Numpy,Boolean,Flood Fill,我感兴趣的是找出布尔数组中“真”面片的各个大小。例如,在布尔矩阵中: [[1, 0, 0, 0], [0, 1, 1, 0], [0, 1, 0, 0], [0, 1, 0, 0]] 产出将是: [[1, 0, 0, 0], [0, 4, 4, 0], [0, 4, 0, 0], [0, 4, 0, 0]] 我知道我可以递归地执行此操作,但我也有这样的印象,即python数组操作在大规模上代价高昂,是否有可用的库函数用于此操作?这里有一个快速简单的完整解决方案: import n

我感兴趣的是找出布尔数组中“真”面片的各个大小。例如,在布尔矩阵中:

[[1, 0, 0, 0],
 [0, 1, 1, 0],
 [0, 1, 0, 0],
 [0, 1, 0, 0]]
产出将是:

[[1, 0, 0, 0],
 [0, 4, 4, 0],
 [0, 4, 0, 0],
 [0, 4, 0, 0]]

我知道我可以递归地执行此操作,但我也有这样的印象,即python数组操作在大规模上代价高昂,是否有可用的库函数用于此操作?

这里有一个快速简单的完整解决方案:

import numpy as np
import scipy.ndimage.measurements as mnts

A = np.array([
    [1, 0, 0, 0],
    [0, 1, 1, 0],
    [0, 1, 0, 0],
    [0, 1, 0, 0]
])

# labeled is a version of A with labeled clusters:
#
# [[1 0 0 0]
#  [0 2 2 0]
#  [0 2 0 0]
#  [0 2 0 0]]
#
# clusters holds the number of different clusters: 2
labeled, clusters = mnts.label(A)

# sizes is an array of cluster sizes: [0, 1, 4]
sizes = mnts.sum(A, labeled, index=range(clusters + 1))

# mnts.sum always outputs a float array, so we'll convert sizes to int
sizes = sizes.astype(int)

# get an array with the same shape as labeled and the 
# appropriate values from sizes by indexing one array 
# with the other. See the `numpy` indexing docs for details
labeledBySize = sizes[labeled]

print(labeledBySize)
输出:

[[1 0 0 0]
 [0 4 4 0]
 [0 4 0 0]
 [0 4 0 0]]
上面最棘手的一行是“fancy”
numpy
索引:

labeledBySize = sizes[labeled]
其中一个数组用于索引另一个数组。有关此操作的详细信息,请参见


我还编写了上述代码的一个版本,作为一个简单的函数,其中包括一个基于随机数组的测试用例。

无论出于何种原因,您都会在图像处理/计算机视觉库中找到这些类型的聚类算法。有你需要的。谢谢!这是非常优雅的。更新,这不工作,因为非常奇怪的原因。也就是说,B[B==label]=size的工作方式与预期不同。分配是完全关闭和随机的-您的原始代码用于较大的矩阵->一个大小(10,10)的随机布尔矩阵将不起作用。我发现了问题所在!对于具有多个索引的较大矩阵,B[B==label]可能以前更改了与新标签相等的索引,然后错误地将其标记为size。@RockyLi-Hah。我应该亲自去抓的。我已经发布了一个修正版的代码,它完全删除了循环,而只支持一个
numpy
奇特的索引操作。还有一个在线实时版本的链接,其中包括一个基于随机数组的测试用例,这确实很有趣,但实际上很容易理解!谢谢你的更新。