Вложенные в Python списки и массивы - PullRequest
0 голосов
/ 23 декабря 2018

У меня есть вывод из кода, где координаты нескольких прямоугольников (четыре угла x, y) предоставляются в списке массивов, содержащих вложенные списки, который выглядит следующим образом:

[array([[[x1, y1],
        [x2, y2],
        [x3, y3],
        [x4, y4]]], dtype=float32), 
...
array([[[x1, y1],
        [x2, y2],
        [x3, y3],
        [x4, y4]]], dtype=float32)]

У меня есть другойсписок соответствующих идентификаторов прямоугольника.который выглядит так:

[[310]
 [401]
...
 [203]
 [181]]

Они находятся в том же порядке, что и координаты.Я хочу объединить оба списка, чтобы получить следующую структуру данных:

[[rect_ID, [(x1,y1),(x2,y2),(x3,y3),(x4,y4)],
[rect_ID, [(x1,y1),(x2,y2),(x3,y3),(x4,y4)],
...
[rect_ID, [(x1,y1),(x2,y2),(x3,y3),(x4,y4)]]

Затем мне нужно отсортировать список по rect_ID

Есть идеи, как этого добиться?

1 Ответ

0 голосов
/ 23 декабря 2018

Вот один из способов сделать это, используя списки.

Объяснение: Вы перебираете комбинацию из двух списков (coords и ids), поскольку они отображают один в один.i[0] дает вам индекс, а j.flatten() преобразует каждый массив вашего coords в один 1d массив.Задача состоит в том, чтобы создать пары координат в виде кортежей.Для этого сначала вы получаете все четные индексированные элементы, начиная с 0, с шагом 2, используя [0::2], и каждый нечетный индексированный элемент, начиная с 1, с шагом 2, используя [1::2].Используя zip, вы объединяете их в пары, а затем, наконец, используете list, чтобы преобразовать их в список [].

Наконец, вы сортируете список final, используя идентификатор (первый элемент) в качестве ключа.

# Sample data (Just taken for example purpose)
coords = [np.array([[[1, 2],
        [2,1],
        [3,2],
        [4,4]]]), 

np.array([[[3,2],
        [1,2],
        [1,4],
        [5,6]]]),

np.array([[[12,2],
        [1,21],
        [1,14],
        [15,6]]])]

ids = [[310],
 [181],[123]]

Код

final = [[i[0], list(zip(j.flatten()[0::2], j.flatten()[1::2]))] for i, j in zip(ids, coords)]

result = sorted(final, key=lambda x: x[0])
print (result)

Выход

[[123, [(12, 2), (1, 21), (1, 14), (15, 6)]],
[181, [(3, 2), (1, 2), (1, 4), (5, 6)]],
[310, [(1, 2), (2, 1), (3, 2), (4, 4)]]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...