我有大小合适的numpy 2D浮点网格(例如> 20k x 10k单元格)。我想计算网格中nodata值的连续组的数量。我可以在python中实现一个简单的pain fill方法,但似乎必须有方法在numpy或scipy中有效地做到这一点,但我没有找到一个明显的方法与ndimage。我当时认为必须有一种计算补丁的方法,我可以创建一个二进制网格并计算与nodata相对应的补丁。是不是可以用scipy的fcluster来做到这一点?
答案 0 :(得分:7)
您可以使用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
这假设“连续”是指“位于网格中的相邻单元格中”而不是“具有相邻值”。
P.S。这适用于任意数量的维度,检查标签函数的文档,以了解如何在多维度中为邻接指定结构元素。