确定边界框中是否有很多点

Determine if many points are in bounding box

数组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 边界上的点应被视为内部。

切片和利用 broadcasting -

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

这假设边界框数组为:

[[x1,y1]
 [x2,y2]]

如果格式是[x1,y1,x2,y2](一维数组)来定义盒子的角,我们可以这样得到它-

((p>=x[:2]) & (p<=x[2:])).all(1)

此外,将 >= 编辑为 > 以此类推以获得边界排他性。

扩展到多个盒子

对于 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)