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])
此外,将>=
编辑为>
,依此类推以限制边界。
扩展到多个框
对于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)