在python中搜索列表中最接近的值

时间:2014-10-31 11:00:28

标签: python arrays list numpy grid

我有一份清单清单:

[[0, 2], [1, 3], [2, 5], [3, 2], [4, 5]]

和列表中的值,例如:[4,0]

想象一下这是xy-grid,我想尽可能找到列表中最接近的值。 我看过这里Find nearest value in numpy array 更确切地说,这一行:idx = np.array([np.linalg.norm(x+y) for (x,y)在数组中 - value]).argmin()

问题在于它总结了x + y,所以它会说[1,3]是最接近的一个,在某些情况下它可能是真的,但不是全部,在这种特殊情况下[3,2]是近。

请帮忙。

1 个答案:

答案 0 :(得分:2)

In [4]: arr = np.array([[0, 2], [1, 3], [2, 5], [3, 2], [4, 5]])

In [5]: value = np.array([4,0])

In [6]: np.linalg.norm(arr-value, axis=1)
Out[6]: array([ 4.47213595,  4.24264069,  5.38516481,  2.23606798,  5.        ])

In [7]: np.linalg.norm(arr-value, axis=1).argmin()
Out[7]: 3

In [8]: arr[np.linalg.norm(arr-value, axis=1).argmin()]
Out[8]: array([3, 2])

请注意,如果arr非常大并且您需要计算最接近许多其他点的arr中的点,那么使用KDTree会更有效率KDTree中的数据(需要O(n log n)时间),搜索最近的点只需要O(log n)时间。使用arr[norm(...).argmin()]需要O(n)时间。

所以,如果你有scipy,你可以找到最近的点:

In [22]: from scipy import spatial

In [23]: tree = spatial.KDTree(arr)

In [24]: distances, indices = tree.query([4, 0])

In [25]: tree.data[indices]
Out[25]: array([3, 2])