我有一个2D 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()可能有所帮助,但不确定如何有效地使用它们来解决这个问题。
答案 0 :(得分:9)
你几乎就在那里,你只需要将ndimage.label
和numpy.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
后,您可以计算质心或使用其他方法获取中心。