3

我有大小合适的 numpy 2D 浮动网格(例如 > 20k x 10k 单元格)。我想计算网格中 nodata 值的连续组的数量。我可以在 python 中实现一个简单的疼痛填充方法,但似乎必须有办法在 numpy 或 scipy 中有效地做到这一点,但我没有找到一个明显的 ndimage 方法。我在想必须有一种方法来计算补丁,我可以创建一个二进制网格并计算与 nodata 对应的补丁。scipy的fcluster可以做到这一点吗?

4

1 回答 1

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

这假设“连续”是指“位于网格中的相邻单元格中”而不是“具有相邻值”。

PS 这适用于任意数量的维度,请查看标签函数的文档以了解如何为多个维度中的邻接指定结构元素。

于 2012-11-19T20:08:34.737 回答