Назначение 2D-кластерных координат фигурам - PullRequest
1 голос
/ 06 мая 2020

Я рассматриваю случай двухмерной (10х10) матрицы, в настоящее время заполненной нулями (в некотором смысле неактивной сетки). В какой-то момент некоторые элементы матрицы станут активными (поэтому будет присвоено значение 1).

Это происходит путем передачи списка координат (X, Y) в матрицу, которая будет активной. Порядок или какие элементы будут первыми, неизвестно. Области, которые становятся активными в матрице, могут быть такими большими, как только один элемент в матрице (1x1), или некоторые части сетки (кластеры) становятся активными в определенном c шаблоне, как в этом примере:

Clusters of information on a matrix

Для начала я могу собрать вместе соседние активные элементы и получить некоторую информацию об этом «кластере»: количество активных элементов в кластере, а также ширину строки и столбца. Например, верхний правый кластер имеет 3 активных элемента, ширину строки 2 и ширину столбца 2.

Моя цель - сопоставить эти кластеры с заранее заданными формами, идентифицированными их ID:

Shapes

Имея количество активных элементов для каждого из кластеров, можно сделать первое грубое разделение на категории:

  • Если один элемент активен в кластере -> Shape ID 0
  • Если два элемента активны в кластере -> Shape ID 1 или 2
  • Если три элемента активны в кластере -> Идентификатор формы 3 - 8
  • Если в кластере активны четыре элемента -> Идентификатор формы 9 - 27

Использование второго типа информации (строка, ширина столбца кластер активных элементов), каждую категорию можно снова разделить. Принятие категории с тремя активными элементами в кластере:

  • Если ширина столбца 3, а ширина строки 1 -> Идентификатор формы 5
  • Если ширина столбца 2 и строка width is 2 -> Shape ID 3, 4, 6 или 7
  • Если ширина столбца 1, а ширина строки 3 -> Shape ID 8

То же можно сделать для кластеров из четырех.

Следуя этой логике c, я могу решить свою проблему и назначить некоторым кластерам их правильную форму. Моя проблема возникает сейчас с фигурами, в которых информации (о количестве активных элементов, ширине их строк и столбцов) недостаточно.

Примером являются верхний правый и нижний правый кластеры на рис. 1. Здесь оба имеют 3 активных элемента, ширина столбца и строки = 2.

Как я могу разделить это еще раз и назначить правильные формы?

1 Ответ

0 голосов
/ 06 мая 2020

Возможно, попробуйте «стандартизировать» координаты вашего кластера - то есть, учитывая список C = [(i1, j1) ... (ik, jk)] координат в кластере (представление кластера), пусть (i *, j *) будет лексикографически первой точкой в ​​списке (то есть самой нижней левой точкой). Вычтите i * и j * из всех координат кластера, отсортируйте координаты и затем ha sh отсортированные координаты. Вы гарантируете, что уникальные формы кластеров имеют уникальные хэши, а кластеры с одинаковой формой теперь имеют разные хеши. Это делается без присвоения определенных идентификаторов кластера c, но их можно легко восстановить, просмотрев набор ключей вашей таблицы ha sh. Надеюсь, это поможет (вы можете легко получить sh все «формы», которые вы определили для назначения меток кластера до / после и сохранить их в отдельной таблице ha sh для получения идентификатора)

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)
...