比较两个不同大小的列表并保留Python中条件为真的项?

2024-09-30 10:32:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写代码,从对象检测模型对边界框执行非最大值抑制。我有一个地理定位边界框的主列表,它们是geolocated_annotations =[[(x1, y1), (x2, y2), (x3, y3), (x4, y4)]]坐标的嵌套列表。(x3,y3)和(x4,y4)坐标是边界框的地理位置。我在深度学习模型中使用了一个嵌入式NMS函数,结果是keep=[[x1, y1, x2, y2]]坐标的嵌套列表。keep中的结果没有最后两个坐标,因为嵌入函数没有考虑地理位置

我想将keep列表与geolocated_annotations列表进行比较,从keep中找到所有(x1,y1)和x2,y2)坐标,它们等于geolocated_annotations中的(x1,y1)和(x2,y2)坐标。来自keep的这两个坐标与来自geolocated_annotations的地理位置坐标相关联,因此如果(x1,y1)和(x2,y2)值相等,则主列表中的(x3,y3)和(x4,y4)值可以与它们关联。我需要以一个包含所有四个(x1,y1)、(x2,y2)、(x3,y3)和(x4,y4)坐标的列表结束

我有一个半工作代码,但它最终在最终列表中保留了比keep列表中更多的坐标。循环遍历所有坐标也需要很长时间

这两个列表的一个更全面的示例:

geolocated_annotations=[[(624169.99807, 4344801.75893), (624170.64013, 4344801.34655), (624159.5841700002, 4344797.0139500005), (624159.1195900001, 4344797.0139500005)], [(624159.9808900001, 4344799.4673500005), (624160.4089300002, 4344799.4673500005), (624160.4089300002, 4344798.887930001), (624159.9808900001, 4344798.887930001)]]

keep=[[624169.99807, 4344801.75893, 624170.64013, 4344801.34655],
 [624151.50361, 4344753.26513, 624151.93165, 4344752.69093],
 [624150.44917, 4344812.13107, 624150.88243, 4344811.58297]]

这是我的起始代码:

bboxes_keep=[]
for i in geolocated_annotations:
        for j in keep:
             if i[0][0]==j[0] and i[0][1]==j[1] and i[1][0]==j[2] and i[2][1]==j[3]:
                bboxes_keep.append(i)

预期产出示例:

bboxes_keep=[[(624169.99807, 4344801.75893), (624170.64013, 4344801.34655), (624159.5841700002, 4344797.0139500005), (624159.1195900001, 4344797.0139500005)]]

关于如何使我的代码更加精炼和准确,有什么想法吗


Tags: 代码列表地理位置边界annotationsx1x2keep
1条回答
网友
1楼 · 发布于 2024-09-30 10:32:09

一般来说,字典查找是开始优化此类问题的最简单方法。因为您有成对的浮点,所以在另一个dict中包含dict的数据存储是实现快速查找的一种方法。我的示例将其与try/except配对,这样,如果x或y不匹配,就会引发异常。请注意,数据存储也是这样设置的:如果有多个点具有相同的x坐标,则所有可能的y值都将在一个键下的字典中

geolocated_annotations=[[(624169.99807, 4344801.75893), (624170.64013, 4344801.34655), (624159.5841700002, 4344797.0139500005), (624159.1195900001, 4344797.0139500005)], [(624159.9808900001, 4344799.4673500005), (624160.4089300002, 4344799.4673500005), (624160.4089300002, 4344798.887930001), (624159.9808900001, 4344798.887930001)]]

    keep=[[624169.99807, 4344801.75893, 624170.64013, 4344801.34655],
 [624151.50361, 4344753.26513, 624151.93165, 4344752.69093],
 [624150.44917, 4344812.13107, 624150.88243, 4344811.58297]]

datastore = {}

for i in keep:

    try:
        datastore[i[0]][i[1]] = True
    except:
        datastore[i[0]] = {i[1]:True} 
    try:
        datastore[i[2]][i[3]] = True
    except:
        datastore[i[2]] = {i[3]:True}

result = []
for row in geolocated_annotations:
    for x,y in row:
        try:
            match = datastore[x][y]
            result.append([x,y])
        except:
            pass

注意:我不得不对这两个列表的结构做一些假设,因为正如评论员所指出的,您的示例中似乎有一些错误。如果我的假设不正确,请修复您的代码并让我知道

相关问题 更多 >

    热门问题