欧几里德距离怎么能用numpy来计算?

我在3D中有两点:

(xa, ya, za) (xb, yb, zb) 

我想要计算距离:

 dist = sqrt((xa-xb)^2 + (ya-yb)^2 + (za-zb)^2) 

用Numpy或者Python来做这个最好的方法是什么? 我有:

 a = numpy.array((xa ,ya, za)) b = numpy.array((xb, yb, zb)) 

使用numpy.linalg.norm

 dist = numpy.linalg.norm(ab) 

SciPy中有一个函数,叫做欧几里得(Euclidean)

例:

 from scipy.spatial import distance a = (1,2,3) b = (4,5,6) dst = distance.euclidean(a,b) 

这个问题解决方法的另一个例子。 只要我提交的问题,我得到它:

 def dist(x,y): return numpy.sqrt(numpy.sum((xy)**2)) a = numpy.array((xa,ya,za)) b = numpy.array((xb,yb,zb)) dist_a_b = dist(a,b) 

我在matplotlib.mlab中find了一个'dist'函数,但是我觉得它不够方便。 我在这里发布,仅供参考。

 import numpy as np import matplotlib as plt a = np.array([1,2,3]) b = np.array([2,3,4]) # distance between a and b dis = plt.mlab.dist(a,b) 

可以这样做,不知道它有多快,但它没有numpy。

 from math import sqrt a = (1,2,3) #data point 1 b = (4,5,6) #data point 2 print sqrt(sum( (a - b)**2 for a, b in zip(a, b))) 
 dist = numpy.linalg.norm(ab) 

是一个很好的线路答案。 但是,如果速度是一个问题,我会build议在你的机器上进行试验。 我发现使用math库的sqrt与广场的**运算符在我的机器上比一行,numpy解决scheme快得多。

我使用这个简单的程序运行我的testing:

 #!/usr/bin/python import math import numpy from random import uniform def fastest_calc_dist(p1,p2): return math.sqrt((p2[0] - p1[0]) ** 2 + (p2[1] - p1[1]) ** 2 + (p2[2] - p1[2]) ** 2) def math_calc_dist(p1,p2): return math.sqrt(math.pow((p2[0] - p1[0]), 2) + math.pow((p2[1] - p1[1]), 2) + math.pow((p2[2] - p1[2]), 2)) def numpy_calc_dist(p1,p2): return numpy.linalg.norm(numpy.array(p1)-numpy.array(p2)) TOTAL_LOCATIONS = 1000 p1 = dict() p2 = dict() for i in range(0, TOTAL_LOCATIONS): p1[i] = (uniform(0,1000),uniform(0,1000),uniform(0,1000)) p2[i] = (uniform(0,1000),uniform(0,1000),uniform(0,1000)) total_dist = 0 for i in range(0, TOTAL_LOCATIONS): for j in range(0, TOTAL_LOCATIONS): dist = fastest_calc_dist(p1[i], p2[j]) #change this line for testing total_dist += dist print total_dist 

在我的机器上, math_calc_dist运行速度比numpy_calc_dist1.5秒23.5秒

为了得到一个可测量的差异,我不得不将TOTAL_LOCATIONS到6000.然后, fastest_calc_dist需要约50秒,math_calc_dist需要约60秒

你也可以尝试numpy.sqrtnumpy.square虽然两者都比我的机器上的mathselect慢。

我的testing是用Python 2.6.6运行的。

a和你定义他们,你也可以使用:

 distance = np.sqrt(np.sum((ab)**2)) 

你可以减去vector,然后内部产品。

遵循你的例子

 a = numpy.array((xa,ya,za)) b = numpy.array((xb,yb,zb)) tmp = a - b sum_squared = numpy.dot(tmp.T , tmp) result sqrt(sum_squared) 

简单的代码很容易理解。

我喜欢np.dot(点积):

 a = numpy.array((xa,ya,za)) b = numpy.array((xb,yb,zb)) distance = (np.dot(ab,ab))**.5 

下面是Python中欧几里得距离的一些简明代码,给出了Python中用列表表示的两点。

 def distance(v1,v2): return sum([(xy)**2 for (x,y) in zip(v1,v2)])**(0.5) 

如果你想find你可以使用的第一个宫缩点的特定点的距离,再加上你可以按照你想要的尺寸来做。

 import numpy as np A = [3,4] Dis = np.sqrt(A[0]**2 + A[1]**2) 

计算多维空间的欧氏距离

  import math x = [1, 2, 6] y = [-2, 3, 2] dist = math.sqrt(sum([(xi-yi)**2 for xi,yi in zip(x,y)])) 5.0990195135927845