我有一个python 3D列表。更清楚地说,是一个列表列表,其中每个列表都是一个框的四个角坐标。我必须过滤所有小于某些给定尺寸的盒子。

让我们假设这是python列表。

box = [[[4, 4], [4, 8], [8, 8], [8, 4]],
      [[8, 8], [8, 16], [16, 16], [16, 8]],
      [[20,16],[20,20],[24,20],[24,16]]
      ...
      ]


我必须过滤所有长度和宽度小于或等于5的框。

filtered_box = [[[4, 4], [4, 8], [8, 8], [8, 4]],
                [[20,16],[20,20],[24,20],[24,16]]
               ...
               ]


这是我当前的代码

filtered_box = []
for c in box:
    min_x, min_y = c[0]
    max_x, max_y = c[2]
    if max_x - min_x <= 5 & min_y - max_y <= 5:
        filtered_box.append(c)


这工作正常,但我需要一个更优化的解决方案。它可以使用numpy并转换回python列表,也可以使用list上的本机python操作。我正在使用Python 3。

最佳答案

numpy的解决方案可能如下所示:

filtered_array = array[
    (np.abs(array[:, 0, 0] - array[:, 3, 0]) < 5) &
    (np.abs(array[:, 0, 1] - array[:, 3, 1]) < 5), :, :]


其中array = np.array(box)

我想如果您准备了数据(numpy数组),则此解决方案将比纯python显着更快。将数据从python列表转换为numpy数组将使任何时间的获取无效。

关于python - 使用list或numpy过滤3D python列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56702705/

10-12 07:32