2017-12-31 72 views
0

私は自分のボット用のStarcraft 2マップ内のミネラル/ガスの領域を特定しようとしています。下の画像は、私が持っている2次元配列のプロットを示しています.1はミネラルパッチまたはガスパッチです。2次元配列のpythonクラスタまたはグループバイナリデータ

私は、あなたが識別したい4つのクラスターがあることがわかります。私が使用しようとしている

from scipy.ndimage import measurements 
lw, num = measurements.label(map) 

(MAP)は、鉱物/ガスパッチが存在するものと64,64アレイです。

これは、4つのクラスタ内に空白があるため、21のクラスタを検出します。

また、アレイを取得するときに探しているクラスタの数もわかりません。私はConnected-componentラベリングを見ていましたが、1または3の位置の要素が離れている限り、見ることができませんでした。私は4つまたは8つの接続方法しか見ていません。

この問題にどのように対処する必要がありますか?

map showing minerals/gas

答えて

0

クラスタは明確に分離されているように見えるので、それらの部分を融合するために少しだけ成長してください。たとえば、あなたはscipy.ndimage.morphology.binary_dilationを使用することができます。

from scipy.ndimage import measurements, morphology 
import numpy as np 

# create mock data 
data = """ 

    1111 1      1 
     1     1 
     1    11111 



111111 111 
      1 
      1 

""" 

data = np.array(data.split('\n')) 
data = data.view('U1').reshape(len(data), -1) == '1' 
# blow it up a bit 
data = np.kron(data, np.ones((2, 2), dtype=int)) 


# "algorithm" starts here 
grow = morphology.binary_dilation(data, structure=np.ones((5, 5), dtype=int) 
lbl, npatches = measurements.label(grow) 
lbl[data==0] = 0 
# end of algorithm 


# show 
res = '\n'.join(lbl.astype('U1').view(f"U{lbl.shape[1]}").ravel()).replace('0', ' ') 
print(res) 

出力:それは直接あなたの実際のデータに動作しない場合

 11111111 11           22 
     11111111 11           22 
        11          22 
        11          22 
        11       22222222  
        11       22222222  






     3333333333 333333          
     3333333333 333333          
          33          
          33          
          33 3333        
          33 3333        

、異なる構造要素を試すか、単にmultiplr回を拡張します。

+0

これはうまくいった。ありがとう。私は私の仕事の2番目の部分を元の投稿に入れるのを忘れていました。別の投稿を作成するかどうかは分かりませんが、私は尋ねようと思っていました。私はまた、これらのクラスターのそれぞれから最適な距離にオブジェクトを配置する場所を見つける必要があります。たとえば、クラスター内の各要素から少なくとも4単位(ユークリッド距離)のクラスターに最も近い点を見つけるにはどうすればよいでしょうか?すなわち、その点はクラスタのどの部分からも4単位以内にあることはできない。 –

+0

@CraigHamilton私はそれが新しい質問のために十分に明確だと思います。 –

-2

これは、実際にclustering algorithms問題の全体のクラスです。

hereのような反復的なk-meansスタイルのアプローチから開始することをお勧めします。サイズ2 - n(またはあなたが見つけると思う多くのクラスタ)のためにそれを実行することができますし、クラスタがどれほど自信を持っているかを測定するためにP値を使用します。 (つまり、3つのクラスタを持つk-meansを実行する場合には、確かに低い/確かでなければならないが、マップ上に明確に3つのクラスタがある場合、2つのクラスタでk-meansを実行すると、P値は非常に高い/不確かでなければならない)

幸運を祈る!

0

これは、単一リンクの階層型クラスタリングまたはDBSCANを使用してクラスタ化するのは簡単です。ミネラルの近くに、そして遠いミネラルを分離するのに十分小さい距離の閾値を使用してください。おそらく5つの細胞がうまく機能します。

+0

提案していただきありがとうございます。私はこのアプローチについても学びます。 –