2013-11-21 15 views
8

いくつかの値がゼロで、いくつかの値がゼロである2D numpy配列があります。私は、配列内のゼロの最大の塊を見つける効率的な方法を見つけようとしています(中心の位置の大まかなアイディアと同様に、ゼロの数を返すことによって)Python - 2D numpy配列内の特定の値の最大領域を効率的に見つける方法

たとえば、この配列では(3,4)の中心に、9の塊を発見したいと思います:

[[ 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 ]] 

はnumpyのか、scipyのダウンロードにこのような何かを達成するために素敵なベクトル化された方法はありますか?

塊は、おおよそ円形であり、それらには穴がありません。

ndimage.label() scipyからはこれに近いものがありますが、私が後にしているものではありません。 numpy.where()numpy.diff()という感じがありますが、この問題を解決するために効率的に使用する方法がわかりません。

+1

穴がある場合はどうなりますか?入力がどのようになっているかを知っているか、穴が空いている塊を除外したいので、穴がないと言っていますか? – user2357112

+0

これは、入力に穴がないことを知っているからです(もしそうなら、非常にまれです) – Brent

答えて

9

あなたはほとんどそこにいる、あなただけnumpy.bincountndimage.labelを結合する必要があります。

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 

あなたはclump_maskを持っていたら、あなたは重心を計算したり、中心を得るために、いくつかの他の方法を使用することができます。

+4

これは私がペーストしようとしていたものにどれくらい近いのですか?私が別にしたのは、 'uint32'から' int32'への変換に関する苦情を受けていたので、(1) '.ravel().stype(int)'でした。(2)あなたの) 'com = scipy.ndimage.center_of_mass(配列== 0、ラベル、largest_label)'を取得します。 – DSM

+0

@DSM偉大な心は似ていると思う:) –

+0

ありがとう!完全に動作:) – Brent

関連する問題