Python - 在2D numpy数组中高效地找到特定值的最大区域

12
我有一个二维numpy数组,其中一些值为零,一些不是。我尝试找到一种有效的方法来查找该数组中最大的零簇(通过返回零的数量以及大致的中心位置)。
例如,在此数组中,我想找到具有9个元素的零簇,并确定其中心位置为(3,4):
[[ 1, 1, 1, 0, 0 ],
 [ 1, 0, 1, 1, 0 ],
 [ 1, 1, 1, 1, 1 ],
 [ 1, 1, 0, 0, 0 ],
 [ 1, 1, 0, 0, 0 ],
 [ 1, 1, 0, 0, 0 ]]

有没有一种好的向量化方法来在numpy或scipy中完成类似这样的操作?

这些聚团大致上是圆形的,而且内部没有孔。

scipy中的ndimage.label()可以实现类似功能,但并不完全符合我的需求。我觉得numpy.where()numpy.diff()可能会有帮助,但不确定如何有效地使用它们来解决这个问题。


1
如果有一个洞怎么办?你是说不会有洞,因为你知道输入数据的样子,还是因为你想排除带有洞的块? - user2357112
这是因为我知道输入不会有任何空缺(如果有,它们将非常罕见)。 - Brent
1个回答

14

你已经接近成功,只需要将ndimage.labelnumpy.bincount结合起来即可:

import numpy as np
from scipy import ndimage

array = np.random.randint(0, 3, size=(200, 200))

label, num_label = ndimage.label(array == 0)
size = np.bincount(label.ravel())
biggest_label = size[1:].argmax() + 1
clump_mask = label == biggest_label

一旦你有了clump_mask,你就可以计算质心或使用其他方法来得到中心点。


6
这与我将要粘贴的内容非常相似,真是疯狂!我唯一做的不同之处是(1)添加了.ravel().astype(int),因为我得到了从uint32转换为int32的投诉,以及(2)我添加了(更改变量名称以匹配您的) com = scipy.ndimage.center_of_mass(array == 0, label, biggest_label)来获取中心点。 - DSM
谢谢!完美运行 :) - Brent
Advent of Code 玩家感谢您! - pinq-

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接