这是Python代码:
import numpy as np
def find_nearest_vector(array, value):
idx = np.array([np.linalg.norm(x+y) for (x,y) in array-value]).argmin()
return array[idx]
A = np.random.random((10,2))*100
""" A = array([[ 34.19762933, 43.14534123],
[ 48.79558706, 47.79243283],
[ 38.42774411, 84.87155478],
[ 63.64371943, 50.7722317 ],
[ 73.56362857, 27.87895698],
[ 96.67790593, 77.76150486],
[ 68.86202147, 21.38735169],
[ 5.21796467, 59.17051276],
[ 82.92389467, 99.90387851],
[ 6.76626539, 30.50661753]])"""
pt = [6, 30]
print find_nearest_vector(A,pt)
#array([ 6.76626539, 30.50661753])
有人可以解释一下获取最近矢量的一步一步的过程吗?功能的整个过程" find_nearest_vector()"。有人能告诉我这个功能的追踪过程吗?谢谢。
答案 0 :(得分:1)
From Wikipedia; L2(欧几里德)范数定义为
np.linalg.norm
只是在numpy中实现这个公式,但一次只能用于两个点。此外,看起来您的实现不正确,正如@unutbu指出的那样,在某些情况下它只会偶然发生。
如果你想对它进行矢量化,我建议你自己用vectorised numpy实现L2规范。
当pt
是一维数组时,这是有效的:
>>> pt = np.array(pt)
>>> A[((A - pt[ None, :]) ** 2).sum(1).argmin()]
array([ 6.76626539, 30.50661753])
注意,最近的点将具有最小的L2范数以及最小的平方 L2范数,因此,在某种意义上,这比额外计算的np.linalg.norm
更有效平方根。