我有一个代码输出,其中在包含嵌套列表的数组列表中提供了几个矩形(四个角 x,y)的坐标,如下所示:
[array([[[x1, y1],
[x2, y2],
[x3, y3],
[x4, y4]]], dtype=float32),
...
array([[[x1, y1],
[x2, y2],
[x3, y3],
[x4, y4]]], dtype=float32)]
我有另一个对应矩形 ID 的列表。看起来像这样:
[[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 对列表进行排序
有什么想法可以实现吗?
最佳答案
这是使用列表推导式执行此操作的一种方法。
说明:您遍历两个列表(coords
和 ids
)的组合,因为它们是一对一映射的。 i[0]
为您提供索引,j.flatten()
将您的每个 coords
数组转换为单个一维数组。然后的任务是创建坐标对作为元组。为此,首先使用 [0::2]
获取从 0 开始的每个偶数索引元素,使用 [0::2]
获取每个从 1 开始的奇数索引元素,使用 [1::2]
。使用 zip,您将它们成对组合,然后最后使用 list
将它们转换为列表 []
。
最后,您使用 id(第一个元素)作为键对 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)]]]
关于python嵌套列表和数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53904175/