我有两个一维网格,每个网格都是有限的单元格集合,其中单元格由左端和右端定义, = , ]。我需要找到这些网格的重叠,即网格#1 的哪个单元格与网格#2 的哪个单元格重叠,以及重叠区域(长度)是多少。
这一定是一个非常标准的问题,并且可能有一个标准的算法。它是否在标准库中实现,最好是在 Python 中?
下面我包含一个 Python 脚本,它以一种简单的方式解决了这个问题,检查每一对网格单元。代码可以打印使用的网格,如果在 test_grid_overlap() 中设置了关键字 show=True
# Usage (in Python)
# > exec(open("grid_overlap.py").read())
# > test_grid_overlap()
#==============================================#
import numpy as np
import time
def overlap(min1, max1, min2, max2):
#-find overlap of two segments
return max(0, min(max1, max2) - max(min1, min2))
def grid_overlap(grid1, grid2):
#-calculate overlap between cells of two 1D grids
ngrid1=len(grid1[0,:])
ngrid2=len(grid2[0,:])
ovlap=np.zeros([ngrid1,ngrid2])
for i in range(0,ngrid1):
for j in range(0,ngrid2):
ovlap[i,j] = overlap(grid1[0,i], grid1[1,i], grid2[0,j], grid2[1,j])
return ovlap
def make_1D_grid(ngrid):
#-generate a 1D grid as a 2D array combining left and right boundaries of cells
#generate a random monotonic sequence
arr = np.sort(np.random.rand(ngrid+1))
left = arr[0:ngrid]
right = arr[1:ngrid+1]
#-combine two 1D arrays (left,right) in a 2D array
grid=np.concatenate([[left],[right]])
return grid
def test_grid_overlap(n1=5, n2=3, show=False):
#-see how it all works
grid1 = make_1D_grid(n1)
grid2 = make_1D_grid(n2)
start=time.time()
res = grid_overlap(grid1, grid2)
end=time.time()
print ("Time elapsed:", end - start)
if show:
print("grid1:")
print(grid1)
print("grid2:")
print(grid2)
print("overlap:")
print(res)