确定在一次Numpy操作中边界框中是否有许多点

问题描述 投票:0回答:1

x数组表示一个边界框,由两个(x,y)坐标定界:

x = np.array([[2, 1], [5, 3]])

[p数组通过(x,y)坐标表示点的集合:

p = np.array([[3, 2], [6, 4], [3, 4], [4, 2]])

对于p中的每个点,我想确定(一次操作)它是否在边界框x中,以便获得以下结果。

result = np.array([1, 0, 0, 1])

尽管我已经了解np.where(),但不确定如何在一次操作中处理整个点集。另外,单纯的数值方法会不会更快?

编辑:

在存在多个边界框的情况下,我也很感兴趣,例如:

# [[bbox_1], [bbox_2], [bbox_2]]
# with each bbox as [x1 y1 x2 y2]
x = np.array([[2, 1, 5, 3], [2, 2, 4, 6], [0, 4, 3, 2]])

结果的形式为

# [p1_bbox_1, p2_bbox_1, p3_bbox_1, p4_bbox_1], [p1_bbox_2, p2_bbox_2 ...]]
# results not necessarily exact but shape is correct
result = np.array([[True, False, False, True], [True, False, False, False], [False, False, True, False]])

应该正好位于bbox边界上的点在内部。

numpy vector coordinates bounding-box
1个回答
1
投票

带有切片并利用broadcasting-

In [24]: ((p>=x[0]) & (p<=x[1])).all(1)
Out[24]: array([ True, False, False,  True])

此外,将>=编辑为>,依此类推以限制边界。

扩展到多个框

对于x中的多个框,其格式为:

[[B1x1,B1y1,B1x2,B1y2],
 [B2x1,B2y1,B2x2,B2y2], ..
                      ]

因此,B1为box-1B2box-2,依此类推,而(x1,y1)(x2,y2)是每个框的边界框角。解决的办法是-

((p>=x[:,None,:2]) & (p<=x[:,None,2:])).all(2)
© www.soinside.com 2019 - 2024. All rights reserved.