在2D数组中查找封闭元素的索引

时间:2019-08-12 19:15:38

标签: python arrays numpy

我有2个nd arrays,其中每一行都是一个3D点,一个数组比另一个数组大得多。

array([[1., 2., 3.],
       [2.01, 5., 1.],
       [3., 3., 4.],
       [1., 4., 1.],
       [3., 6., 7.01]])

array([[3.02, 3.01, 4.0],
      [1.01, 1.99, 3.01],
      [2.98, 6.01, 7.01]])

知道,第二个数组中的每个点都对应第一个数组中的一个点。
我想获取对应索引列表,
即本例中为

 array([2,0,4])

第二个数组中的第一个点与第一个数组中的第三个点相似,第二个数组中的第二点与第一个数组中的第一个点相似,等等。

2 个答案:

答案 0 :(得分:4)

您可以使用KDTree有效地做到这一点。

import numpy as np
from scipy.spatial import KDTree

x = np.array([[1., 2., 3.],
       [2.01, 5., 1.],
       [3., 3., 4.],
       [1., 4., 1.],
       [3., 6., 7.01]])

y = np.array([[1.01, 1.99, 3.01],
       [3.02, 3.01, 4.0],
       [2.98, 6.01, 7.01]])

result = KDTree(x).query(y)[1]

# In [16]: result                                                        
# Out[16]: array([0, 2, 4])

感谢Divakar指出scipy还提供了KDTree的C实现,称为cKDTree。对于以下基准测试,速度提高了10倍:

x = np.random.rand(100_000, 3)
y = np.random.rand(100, 3)

def benchmark(TreeClass):
    return TreeClass(x).query(y)[1]

In [23]: %timeit q.benchmark(KDTree)                                   
322 ms ± 7.76 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [24]: %timeit q.benchmark(cKDTree)                                  
36.5 ms ± 763 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

答案 1 :(得分:2)

我们可以将其中之一扩展到3D,然后使用给定的公差参数(在给定的示例中,该参数似乎是<= 0.2)与np.isclose()或{{1 }},最后沿最后一个轴获得np.abs()<tolerance匹配项并获得索引-

ALL