确定边界框中是否有很多点
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-1
,B2
是box-2
等等,而(x1,y1)
和(x2,y2)
是每个框的边界框角.解决方案是 -
((p>=x[:,None,:2]) & (p<=x[:,None,2:])).all(2)
数组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-1
,B2
是box-2
等等,而(x1,y1)
和(x2,y2)
是每个框的边界框角.解决方案是 -
((p>=x[:,None,:2]) & (p<=x[:,None,2:])).all(2)