如何在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。这实际上是我的问题的根源,大多数坐标是相等的,但是一些坐标被一些小的浮点数隔开了