【问题标题】:python nested lists and arrayspython嵌套列表和数组
【发布时间】:2019-05-23 01:41:40
【问题描述】:

我有一个代码的输出,其中在包含嵌套列表的数组列表中提供了几个矩形(四个角 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 对列表进行排序

有什么想法可以实现吗?

【问题讨论】:

  • 要挑剔 - 您的初始列表包含 2 个数组,每个数组都是 2d。它们不包含嵌套列表(尽管它们的 .tolist() 输出将是嵌套列表)。

标签: python arrays list numpy nested


【解决方案1】:

这是使用列表推导的一种方法。

解释:您循环遍历两个列表(coordsids)的组合,因为它们是一对一映射的。 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)]]]

【讨论】:

  • 行得通!非常感谢您出色而及时的回答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-22
  • 2019-10-04
  • 2019-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多