2014-10-31 105 views
-4

中列出的名單最接近的值我列出的清單:搜索蟒蛇

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

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

想象這是xy網格和我想盡可能在​​列表中找到最接近的值。 我在這裏看着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

那麼,爲什麼'[1,3]'不衣櫥裏所有的情況?你能給我們提供一些例子嗎? – 2014-10-31 11:02:04

回答

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])