我有一个代码输出,其中在包含嵌套列表的数组列表中提供了几个矩形(四个角x,y)的坐标,如下所示:
constructor(private loader: LoaderService) {
this.loader.display(true);
this.subscription = this.dataSvc.data.subscribe(
data => console.log('Data:', data),
err => console.log(err),
() => this.loader.display(false)
);
}
我还有另一个对应的矩形ID列表。看起来像这样:
[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对列表进行排序
任何想法如何实现这一目标?
答案 0 :(得分:2)
这是使用列表推导的一种方法。
说明:由于两个列表(coords
和ids
一对一映射,因此您可以对其进行循环浏览。 i[0]
为您提供索引,j.flatten()
将coords
的每个数组转换为一个一维数组。然后的任务是将成对的坐标创建为元组。为此,首先使用[0::2]
获取以2为步长从0开始的每个偶数索引元素,使用[1::2]
以2步进来从1开始的每个奇数索引元素。使用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)]]]