二维数组

时间:2017-12-31 01:39:56

标签: python numpy cluster-analysis

我正在尝试为我的机器人识别星际争霸2地图中的矿物/气体区域。下图显示了我所拥有的二维阵列的图,其中1'表示矿物或气体补丁。

注视它你可以看到有4个我想识别的星团。

我尝试过使用:

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

(map)是一个64,64阵列,其中有一个矿物/气体补丁。

这找到21个集群,因为在4个集群中,有一些空格。

另外,当我得到一个数组时,我不知道我正在寻找多少个集群。我正在研究连接组件标签,但是只要1s说3或4个位置元素就可以看到我看不到的方法,它们可以被认为是连接的。我只看过4或8个连接方法。

我应该如何解决这个问题?

map showing minerals/gas

3 个答案:

答案 0 :(得分: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次。

答案 1 :(得分:0)

使用单链路层次聚类或DBSCAN进行集群是微不足道的。只需使用足够小的距离阈值来连接矿物附近,并分离远处的矿物质。可能5个细胞工作正常。

答案 2 :(得分:-2)

这实际上是一整类问题,clustering algorithms

我建议从迭代的k-means风格方法开始,例如here。你可以运行它的大小2 - n(或者你认为你会发现的群集很多),然后使用P值来衡量群集的信心程度。 (即,当地图上有明显的3个聚类时,运行具有2个聚类的k-means时,P值应该非常高/不确定,如果你运行具有3个聚类的k均值,它们应该是低/确定的)

祝你好运!