欧几里德距离怎么能用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_dist
: 1.5秒与23.5秒 。
为了得到一个可测量的差异,我不得不将TOTAL_LOCATIONS
到6000.然后, fastest_calc_dist
需要约50秒,而math_calc_dist
需要约60秒 。
你也可以尝试numpy.sqrt
和numpy.square
虽然两者都比我的机器上的math
select慢。
我的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