Python 为形状指定二维聚集坐标 我考虑2D(10x10)矩阵的情况,当前填充有零点(在某种意义上说,是非活动网格)。 在某个时刻,某些矩阵元素将变为活动状态(因此,值1将被赋予属性)

Python 为形状指定二维聚集坐标 我考虑2D(10x10)矩阵的情况,当前填充有零点(在某种意义上说,是非活动网格)。 在某个时刻,某些矩阵元素将变为活动状态(因此,值1将被赋予属性),python,matrix,cluster-analysis,shapes,Python,Matrix,Cluster Analysis,Shapes,发生这种情况的方法是在矩阵上传递一个将被激活的(X,Y)坐标列表。顺序或哪些元素将首先出现是未知的。在矩阵上变为活动的区域可以与矩阵中的一个元素(1x1)一样大,或者网格的某些部分(簇)以特定模式变为活动,如本例中所示: 首先,我能够将活动的相邻元素组合在一起,并获得有关“集群”的一些信息:集群中活动元素的数量,以及行和列的宽度。 例如,右上角的簇有3个活动元素,行宽为2,列宽为2 我的目标是将这些簇与预定义的形状相匹配,这些形状由它们的ID标识: 有了每个簇的活动元素数量,可以进行第一次粗

发生这种情况的方法是在矩阵上传递一个将被激活的(X,Y)坐标列表。顺序或哪些元素将首先出现是未知的。在矩阵上变为活动的区域可以与矩阵中的一个元素(1x1)一样大,或者网格的某些部分(簇)以特定模式变为活动,如本例中所示:

首先,我能够将活动的相邻元素组合在一起,并获得有关“集群”的一些信息:集群中活动元素的数量,以及行和列的宽度。 例如,右上角的簇有3个活动元素,行宽为2,列宽为2

我的目标是将这些簇与预定义的形状相匹配,这些形状由它们的ID标识:

有了每个簇的活动元素数量,可以进行第一次粗分类:

  • 如果簇中有一个元素处于活动状态->形状ID 0
  • 如果簇中有两个元素处于活动状态->形状ID 1或2
  • 如果一个簇中有三个元素处于活动状态->形状ID 3-8
  • 如果一个簇中有四个元素处于活动状态->形状ID 9-27
利用第二类信息(活动元素簇的行、列宽),可以再次拆分每个类别。将类别划分为一个簇中有三个活跃元素:

  • 如果列宽为3,行宽为1->形状ID 5
  • 如果列宽为2,行宽为2->形状ID 3、4、6或7
  • 如果列宽为1,行宽为3->Shape ID 8
四个集群也可以这样做

按照这个逻辑,我可以解决我的问题,并将一些簇分配给它们正确的形状。 现在,我的问题出现在形状上,这些形状的信息(关于活动元素的数量、它们的行和列宽)不足

一个示例是图1的右上和右下簇。 在这里,两个元素都有3个活动元素,列宽和行宽=2

我怎样才能再次划分并分配正确的形状呢?

也许可以尝试“标准化”你的簇坐标-也就是说,给定簇中坐标的列表C=[(i1,j1)…(ik,jk)](簇的一种表示形式),让(I*,j*)成为列表中按字典顺序排列的第一个点(即最左下的点)。从所有簇坐标中减去i*和j*,对坐标进行排序,然后对排序后的坐标进行散列。我们保证,唯一的簇形状具有唯一的哈希值,具有相同形状的簇现在具有不同的哈希值。这是在不指定特定集群ID的情况下完成的,但是可以通过查看哈希表的键集轻松地恢复它们。希望这对您有所帮助(您可以轻松地散列您定义的所有“形状”,以在前后分配集群标签,并将它们存储在单独的散列表中以获取id)

也许可以尝试“标准化”集群坐标-即,给定集群中坐标的列表C=[(i1,j1)…(ik,jk)](集群的表示),让(i*,j*)成为列表中的第一个按字典顺序排列的点(即最左下方的点)。从所有簇坐标中减去i*和j*,对坐标进行排序,然后对排序后的坐标进行散列。我们保证,唯一的簇形状具有唯一的哈希值,具有相同形状的簇现在具有不同的哈希值。这是在不指定特定集群ID的情况下完成的,但是可以通过查看哈希表的键集轻松地恢复它们。希望这对您有所帮助(您可以轻松地散列您定义的所有“形状”,以在前后分配集群标签,并将它们存储在单独的散列表中以获取id)


我需要一些时间来实现这一点,因为我必须自己生成更高级别的形状。但我确实遵循了你的推理,而且毫无瑕疵。非常感谢你的帮助@没问题,很高兴这有帮助!我需要一些时间来实现这一点,因为我必须自己生成更高级别的形状。但我确实遵循了你的推理,而且毫无瑕疵。非常感谢你的帮助@没问题,很高兴这有帮助!
import numpy as np

#assume we have clusters of the form
#C = [[i1,j1],[i2,j2],...,[ik,jk]]
#let "Clusters" be the set of all such Cs
#let "Shapes" be a set of tuples containing the
#coordinates of all the shapes you defined, 
#plus the corresponding id
#i.e. Shapes = [[shape1,ID1],[shape2,ID2]...]

def gen_hash(cluster):
    sorted = np.lexsort(cluster)
    smallest = sorted[0]
    sorted[:,0]-=smallest[0]
    sorted[:,1]-=smallest[1]
    return str(sorted)

shape_ids = {gen_hash(shape):ID for (shape,ID) in Shapes}

for c in Clusters:
    c_hash = gen_hash(c)
    c_id = shape_ids[c_hash]
    print('this cluster has ID :',c_id)