我有大小合适的numpy 2D浮点网格(例如> 20k x 10k单元格).我想计算网格中nodata值的连续组的数量.我可以在
python中实现一个简单的pain fill方法,但似乎必须有方法在numpy或scipy中有效地做到这一点,但我没有找到一个明显的方法与ndimage.我当时认为必须有一种计算补丁的方法,我可以创建一个二进制网格并计算与nodata相对应的补丁.用scipy的fcluster可以做到这一点吗? 最佳答案 您可以使用
scipy.ndimage.measurements.label()来计算连续区域,使用numpy.isnan()来获取nodata值的掩码.例:
>>> a = numpy.zeros( (5, 5) )
>>> a[0,0] = numpy.NaN
>>> a[3,3:5] = numpy.NaN
>>> a
array([[ nan, 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., nan, nan],
[ 0., 0., 0., 0., 0.]])
>>> labels, num_labels = scipy.ndimage.measurements.label ( numpy.isnan( a ) )
>>> labels
array([[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 2, 2],
[0, 0, 0, 0, 0]])
>>> num_labels
2
这假设“连续”是指“位于网格中的相邻单元格中”而不是“具有相邻值”.
附:这适用于任意数量的维度,检查标签函数的文档,以了解如何在多维度中为邻接指定结构元素.