如何在python(numpy)中找到两个x,y坐标数组之间的可容忍重叠

如何在python(numpy)中找到两个x,y坐标数组之间的可容忍重叠,python,performance,numpy,Python,Performance,Numpy,我有两个不同长度的二维数组。如何在一定公差范围内找到这些阵列沿第零轴的重叠?例如,如果 a1 = [1,1.2] a2 = [1,2.1] a3 = [1,1.1] a4 = [.89, 2.21] a5 = [0,0] coors1 = np.array( [ a1, a2 ]) coors2 = np.array( [ a3, a4, a5 ]) 然后我想要一个函数重叠,给出 overlap( coors1,coors2, tolerance=0.1) #[ [1,1.2] ] over

我有两个不同长度的二维数组。如何在一定公差范围内找到这些阵列沿第零轴的重叠?例如,如果

a1 = [1,1.2]
a2 = [1,2.1]
a3 = [1,1.1]
a4 = [.89, 2.21]
a5 = [0,0] 
coors1 = np.array( [ a1, a2 ])
coors2 = np.array( [ a3, a4, a5 ])
然后我想要一个函数重叠,给出

overlap( coors1,coors2, tolerance=0.1)
#[ [1,1.2] ]
overlap( coors1, coors2, tolerance=0.12)
#[ [ 1,1.2], [1, 2.1] ]
我想出了类似的办法

def overlap(coor1, coors2, tolerance ) :
    return [ c1 for c1 in coors1 for c2 in coors2 if np.all( np.isclose( c1, c2, atol=tolerance))   ]
但看起来可能会很慢

对于那些感兴趣并愿意插话的人
我的问题源于我正在做的一些数据库工作。我有几个数据库,每个数据库都有x,y坐标作为列。还有表示在这些坐标处执行的各种测量的列。我需要根据坐标比较数据库,考虑到一些坐标可能存在浮点舍入错误。

如果我得到了正确的问题,您可以使用以矢量化方式解决它-

def overlap(coors1, coors2, tolerance ):

    # Perform elementwise absolute subtractions between input arrays 
    sub_abs_vals = np.abs(coors1[None,:,:] - coors2[:,None,:])

    # Check for ANY equality along 0-th axis & ALL equality along 2-nd axis.
    # Return the corresponding row from first input array.
    return coors1[np.all(np.any(sub_abs_vals<=tolerance,axis=0),axis=1)]
验证结果-

In [124]: coors1
Out[124]: 
array([[ 1. ,  1.2],
       [ 1. ,  2.1]])

In [125]: coors2
Out[125]: 
array([[ 1.  ,  1.1 ],
       [ 0.89,  2.21],
       [ 0.  ,  0.  ],
       [ 1.  ,  1.06]])

In [126]: def overlap1(coors1, coors2, tolerance ) :
     ...:     return [ c1 for c1 in coors1 for c2 in coors2 if np.all( np.isclose( c1, c2, atol=tolerance))   ]
     ...: 
     ...: 
     ...: def overlap2(coors1, coors2, tolerance ):
     ...:     sub_abs_vals = np.abs(coors1[None,:,:] - coors2[:,None,:])
     ...:     return coors1[np.all(np.any(sub_abs_vals<=tolerance,axis=0),axis=1)]
     ...: 

In [127]: overlap1(coors1, coors2, 0.1 )
Out[127]: [array([ 1. ,  1.2])]

In [128]: overlap2(coors1, coors2, 0.1 )
Out[128]: array([[ 1. ,  1.2]])

In [129]: overlap1(coors1, coors2, 0.12 )
Out[129]: [array([ 1. ,  1.2]), array([ 1. ,  2.1])]

In [130]: overlap2(coors1, coors2, 0.12 )
Out[130]: 
array([[ 1. ,  1.2],
       [ 1. ,  2.1]])

你有没有试过?请发布它,并询问它的不足之处如何处理它,will postSo,最终它应该从coors1中选择行?这可能与您的问题无关,但请注意,0.1是一个众所周知的表示糟糕的浮点数。例如,0.1+0.2不是0.3,而是0.300000000000000004。这实际上是我的问题的根源,大多数坐标是相等的,但是一些坐标被一些小的浮点数隔开了