Python - 在2D numpy数组中查找特定值的最大区域的有效方法

Bre*_*ent 10 python numpy scipy multidimensional-array

我有一个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 ]]
Run Code Online (Sandbox Code Playgroud)

是否有一个很好的矢量化方式来在numpy或scipy中完成这样的事情?

这些团块的形状大致为圆形,并且没有孔.

来自scipy的ndimage.label()做了一些与此相近的事情,但并不是我所追求的.我有一种感觉numpy.where()numpy.diff()可能会有所帮助,但不知道如何有效地使用它们来解决这个问题.

Bi *_*ico 10

你几乎没有,你只需要结合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
Run Code Online (Sandbox Code Playgroud)

一旦你有了,clump_mask你可以计算质心或使用其他方法来获得中心.

  • 这是*疯了*这与我要粘贴的程度有多接近!我做的唯一不同的是(1)`.ravel().astype(int)`,因为我得到关于从`uint32`转换为`int32`的投诉,以及(2)我添加(更改变量名称以匹配)你的)`com = scipy.ndimage.center_of_mass(array == 0,label,largest_label)`来获得中心. (4认同)