我有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])
第二个数组中的第一个点与第一个数组中的第三个点相似,第二个数组中的第二点与第一个数组中的第一个点相似,等等。
答案 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