两个矩形与NumPy的交点

2024-09-28 21:27:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的函数来求两个矩形的交点。它有点慢,我不知道是因为OR条件还是>, <运算符。我想知道是否有办法提高is_intersect()函数的性能。也许是跟NumPy?还是赛顿

import numpy as np

def is_intersect(rect1, rect2):
    xmin1, xmax1, ymin1, ymax1 = rect1
    xmin2, xmax2, ymin2, ymax2 = rect2
    if xmin1 > xmax2 or xmax1 < xmin2:
        return False
    if ymin1 > ymax2 or ymax1 < ymax2:
        return False
    return True

N_ELEMS = 100000000
rects1 = np.random.rand(N_ELEMS,4)
rects2 = np.random.rand(N_ELEMS,4)

temp_dct = dict()

for i in range(N_ELEMS):
    rect1 = rects1[i,:]
    rect2 = rects2[i,:]
    if is_intersect(rect1, rect2):
        temp_dct[i] = True

我不能从缓存结果中获益,因为点将是增量的,也就是说,一个矩形将在空间中移动(从不在同一个位置)。在本例中,我使用了NumPy的random()函数,但实际使用情况并非如此。我将调用is_intersect()函数100000次或更多次


Tags: 函数numpyreturnifisnprandomintersect
1条回答
网友
1楼 · 发布于 2024-09-28 21:27:19

您可以通过使用矢量化比较和np.any避免for循环来提高性能:

result = (1 - np.any([rects1[:,0] > rects2[:,1], 
                      rects1[:,1] < rects2[:,0], 
                      rects1[:,2] > rects2[:,3], 
                      rects1[:,3] < rects2[:,2]], 
                     axis=0)).astype(bool)

您没有字典,但可以通过索引访问result

100米元素的性能:

import numpy as np
import timeit

N_ELEMS = 100_000_000
rects1 = np.random.rand(N_ELEMS,4)
rects2 = np.random.rand(N_ELEMS,4)

start_time = timeit.default_timer()
result = (1 - np.any([rects1[:,0] > rects2[:,1], 
                      rects1[:,1] < rects2[:,0], 
                      rects1[:,2] > rects2[:,3], 
                      rects1[:,3] < rects2[:,2]], 
                     axis=0)).astype(bool)

print(timeit.default_timer() - start_time)
2.9162093999999996

相关问题 更多 >