如何使用容差获取两个numpy数组的相似元素

3

我想比较两个不同的numpy数组A和B中列的数值。具体来说,A包含实验数据,我想将其与B的第三列中给定的理论数值进行匹配。

由于不存在完美匹配,因此我必须使用公差,例如0.01。对于A中的每个值,我希望在所选公差范围内在B中找到0到20个匹配项。结果,我想获得那些与A中的值在公差范围内的B中的行。

为了更具体地说明,这里有一个示例:

A = array([[  2.83151742e+02,   a0],
   [  2.83155339e+02,   a1],
   [  3.29241719e+02,   a2],
   [  3.29246229e+02,   a3]])


B = array([[ 0, 0,  3.29235519e+02, ...],
   [ 0, 0,  3.29240819e+02, ...],
   [ 0, 0,  3.29241919e+02, ...],
   [ 0, 0,  3.29242819e+02, ...]])

因此,在容差为0.02的情况下,B的所有值都与A [3,0]和A [4,0]匹配。

我希望结果如下,其中包括A匹配的C [:,0]的值以及C [:,0]和C [:,2]之间的差异:

C = array([[ 3.29241719e+02, c0,  3.29235519e+02, ...],
   [ 3.29241719e+02, c1,  3.29240819e+02, ...],
   [ 3.29241719e+02, c2,  3.29241919e+02, ...],
   [ 3.29241719e+02, c3,  3.29242819e+02, ...]
   [ 3.29242819e+02, c4,  3.29235519e+02, ...],
   [ 3.29242819e+02, c5,  3.29240819e+02, ...],
   [ 3.29242819e+02, c6,  3.29241919e+02, ...],
   [ 3.29242819e+02, c7,  3.29242819e+02, ...]])

通常情况下,A的形状为(500,2),B的形状为(300000,11)。我可以使用for循环解决它,但是这需要很长时间。

对于这种比较,最有效的方法是什么?


Show your loopy code? - Divakar
1个回答

1
我想象中应该是这样的。
i = np.nonzero(np.isclose(A[:,:,None], B[:, 2]))[-1]

np.isclose 接受几个不同的容差参数。

接近 A 值的 B 值将是 B[i, 2]


{btsdaf} - Jogi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接