我有一份清单清单:
[[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]是近。
请帮忙。
答案 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])