3

適切なサイズの numpy 2D float グリッドがあります (例: > 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 に答える