Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-基于分数和位置对框进行排序_Python - Fatal编程技术网

Python-基于分数和位置对框进行排序

Python-基于分数和位置对框进行排序,python,Python,我一直在研究以下问题:我有一个未知数量的矩形数组,每个矩形都有一个对应的“分数”: [{“左上角”:{“x”:20,“y”:60}, “右下角”:{“x”:540,“y”:600}, “分数”:50}, 等] 我想按顺序删除这些矩形,直到到达最后一个矩形。然而,最大的规定是,在每次迭代中,我都希望删除得分最低的最外层矩形之一。所谓最外层,我的意思是,如果在所有剩余的矩形周围绘制一个边界框,那么最外层的将是与该边界框接触的矩形 下面是一个例子: 在本图中,得分最高的框为红色,得分最低的框为浅蓝色

我一直在研究以下问题:我有一个未知数量的矩形数组,每个矩形都有一个对应的“分数”:

[{“左上角”:{“x”:20,“y”:60},
“右下角”:{“x”:540,“y”:600},
“分数”:50},
等]

我想按顺序删除这些矩形,直到到达最后一个矩形。然而,最大的规定是,在每次迭代中,我都希望删除得分最低的最外层矩形之一。所谓最外层,我的意思是,如果在所有剩余的矩形周围绘制一个边界框,那么最外层的将是与该边界框接触的矩形

下面是一个例子:

在本图中,得分最高的框为红色,得分最低的框为浅蓝色(最小的矩形),深蓝色框得分中等

首先,我将删除包含所有这些元素的最大红方块,因为它是唯一与“边界框”共用一个边的框

然后三个盒子与边界框共用一个侧面,红色的小盒子和两个深蓝色的盒子。我会去掉其中一个深蓝色的(以得分最小的为准)

这将一直持续到我只剩下一个红色的小盒子(在本例中)。希望这是有道理的

到目前为止,我基本上设计了一个算法,循环遍历所有剩余的框,并找到得分最小的框,该框也与边界框共享一个边,然后移除该框并重复。这很好用,但在我看来效率相当低


我想知道是否有人有任何聪明的想法,如何按照盒子需要移除的顺序对盒子进行排序,然后我只需遍历排序后的数组并按顺序移除盒子。或者,这样做可能不会更有效率?

您可以构建四个列表,每个列表按从外部到内部的顺序排列框,从上到下、从下到上、从左到右、从右到左。然后,您可以选择要移除的框:

b = min([tb[0], bt[0], lr[0], rl[0]], key=lambda b: b["score"])
tb.remove(b)
bt.remove(b)
lr.remove(b)
rl.remove(b)
构建每个列表都需要排序:

tb = sorted(boxes, key=lambda b: b["topleft"]["y"])
lr = sorted(boxes, key=lambda b: b["topleft"]["x"])
bt = sorted(boxes, key=lambda b: b["bottomright"]["y"], reverse=True)
rl = sorted(boxes, key=lambda b: b["bottomright"]["x"], reverse=True)

每一个都按照盒子四个侧面中的一个从外到内的顺序排列盒子。

有多少个盒子?除非有数千人,否则我高度怀疑优化这一点是否值得花费任何时间或精力。可能最多几百人,但通常不到一百人。除了优化之外,我只是觉得如果有一些短排序算法可以处理这个问题,代码会更干净一些。非常感谢-这看起来肯定比我以前有过的更干净的解决方案,但是如果它更高效,有什么想法吗?显然,如果没有这两段代码,您无法对其进行基准测试-但是执行4种排序似乎相当繁重..不?有了这样的东西,我会100%选择更干净的解决方案,而不是最快的解决方案。如果你的用户感觉不到任何减速,那么拥有易于维护的代码是绝对值得的。事实上,排序是便宜的,删除是昂贵的。