将二维聚类坐标分配给形状
Assign 2D clustered coordinates to shapes
我考虑的是 2D (10x10) 矩阵的情况,当前用零填充(从某种意义上说,是非活动网格)。
在某些时候,一些矩阵元素将变为活动状态(因此,将赋予值 1)。
发生这种情况的方式是在将激活的矩阵上传递 (X,Y) 坐标列表。顺序或哪些元素先出现是未知的。在矩阵上变得活跃的区域可以大到矩阵中的一个元素 (1x1) 或者网格的某些部分(簇)以特定模式变得活跃,如本例所示:
首先,我能够将相邻的活动元素聚集在一起并获得一些相关信息 "cluster":簇中活动元素的数量,以及行宽和列宽。
例如,右上角的簇有 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 -> 形状 ID 8
可以对四人组进行同样的操作。
按照这个逻辑,我可以解决我的问题并将一些簇分配给它们正确的形状。
我的问题现在出现在信息(关于活动元素的数量、它们的行和列宽度)不足的形状上。
一个例子是图1的右上角和右下角的集群。
这里,两者都有 3 个元素处于活动状态,列宽和行宽 = 2.
我怎样才能再次划分它并分配正确的形状?
也许可以尝试 "standardizing" 您的集群坐标 - 也就是说,给定一个集群坐标列表 C = [(i1,j1)...(ik,jk)](集群的表示), 设 (i*,j*) 为列表中按词典顺序排列的第一个点(即最左下角的点)。从所有簇坐标中减去 i* 和 j*,对坐标进行排序,然后对排序后的坐标进行哈希处理。您可以保证独特的簇形状具有独特的哈希值,并且具有相同形状的簇现在具有不同的哈希值。这是在没有分配特定集群 ID 的情况下完成的,但可以通过查看散列的密钥集 table 轻松恢复它们。希望这会有所帮助(您可以轻松散列您定义的所有 "shapes" 以分配集群标签 before/after 并将它们存储在单独的散列 table 中以获取 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)
我考虑的是 2D (10x10) 矩阵的情况,当前用零填充(从某种意义上说,是非活动网格)。 在某些时候,一些矩阵元素将变为活动状态(因此,将赋予值 1)。
发生这种情况的方式是在将激活的矩阵上传递 (X,Y) 坐标列表。顺序或哪些元素先出现是未知的。在矩阵上变得活跃的区域可以大到矩阵中的一个元素 (1x1) 或者网格的某些部分(簇)以特定模式变得活跃,如本例所示:
首先,我能够将相邻的活动元素聚集在一起并获得一些相关信息 "cluster":簇中活动元素的数量,以及行宽和列宽。 例如,右上角的簇有 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 -> 形状 ID 8
可以对四人组进行同样的操作。
按照这个逻辑,我可以解决我的问题并将一些簇分配给它们正确的形状。 我的问题现在出现在信息(关于活动元素的数量、它们的行和列宽度)不足的形状上。
一个例子是图1的右上角和右下角的集群。 这里,两者都有 3 个元素处于活动状态,列宽和行宽 = 2.
我怎样才能再次划分它并分配正确的形状?
也许可以尝试 "standardizing" 您的集群坐标 - 也就是说,给定一个集群坐标列表 C = [(i1,j1)...(ik,jk)](集群的表示), 设 (i*,j*) 为列表中按词典顺序排列的第一个点(即最左下角的点)。从所有簇坐标中减去 i* 和 j*,对坐标进行排序,然后对排序后的坐标进行哈希处理。您可以保证独特的簇形状具有独特的哈希值,并且具有相同形状的簇现在具有不同的哈希值。这是在没有分配特定集群 ID 的情况下完成的,但可以通过查看散列的密钥集 table 轻松恢复它们。希望这会有所帮助(您可以轻松散列您定义的所有 "shapes" 以分配集群标签 before/after 并将它们存储在单独的散列 table 中以获取 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)