Скажем, у меня есть такой массив:
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 различных области: верхняя левая 1 с, 3 с, 4 с и правая 1 с.
Как бы я получил путиза границы каждого региона?Координаты вершин области, в следующем порядке:
Например, для верхних левых 1 с, это (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
]
}
Итак, как мне преобразовать это в путь?