使用numpy.linarg.norm()函数查找数组的最近点

时间:2018-03-24 17:40:52

标签: python arrays numpy

这是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()"。有人能告诉我这个功能的追踪过程吗?谢谢。

1 个答案:

答案 0 :(得分:1)

From Wikipedia; L2(欧几里德)范数定义为

enter image description here

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更有效平方根。