Скажем, у меня есть такой массив:
import numpy as np
arr = np.array([
[1, 1, 3, 3, 1],
[1, 3, 3, 1, 1],
[4, 4, 3, 1, 1],
[4, 4, 1, 1, 1]
])
Есть 4 отдельных области: верхняя левая 1s, 3s, 4s и правая 1s.
Как мне получить пути для границ каждого региона? Координаты вершин области по порядку.
Например, для верхней левой единицы это (0, 0), (0, 2), (1, 2), (1, 1), (2, 1), (2, 0)
(В конечном итоге я хочу получить что-то вроде start at 0, 0. Right 2. Down 1. Right -1. Down 1. Right -1. Down -2.
, но это легко преобразовать, так как это просто разница между соседними вершинами)
Я могу разделить его на регионы с помощью scipy.ndimage.label
:
from scipy.ndimage import label
regions = {}
# region_value is the number in the region
for region_value in np.unique(arr):
labeled, n_regions = label(arr == region_value)
regions[region_value] = [labeled == i for i in range(1, n_regions + 1)]
Что больше похоже на это:
{1: [
array([
[ True, True, False, False, False],
[ True, False, False, False, False],
[False, False, False, False, False],
[False, False, False, False, False]
], dtype=bool), # Top left 1s region
array([
[False, False, False, False, True],
[False, False, False, True, True],
[False, False, False, True, True],
[False, False, True, True, True]
], dtype=bool) # Right 1s region
],
3: [
array([
[False, False, True, True, False],
[False, True, True, False, False],
[False, False, True, False, False],
[False, False, False, False, False]
], dtype=bool) # 3s region
],
4: [
array([
[False, False, False, False, False],
[False, False, False, False, False],
[ True, True, False, False, False],
[ True, True, False, False, False]
], dtype=bool) # 4s region
]
}
Итак, как мне преобразовать это в путь?