我在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))
#1楼
可以像下面这样完成。 我不知道它有多快,但是它没有使用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)))
#2楼
此问题解决方法的另一个实例:
def dist(x,y):
return numpy.sqrt(numpy.sum((x-y)**2))
a = numpy.array((xa,ya,za))
b = numpy.array((xb,yb,zb))
dist_a_b = dist(a,b)
#3楼
dist = numpy.linalg.norm(a-b)
背后的理论:如数据挖掘导论所述
之所以有效,是因为欧几里得距离为l2范数,并且numpy.linalg.norm中ord参数的默认值为2。
#4楼
我在matplotlib.mlab中找到了一个“ 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)
#5楼
SciPy中有一个功能。 这就是欧几里得语 。
例:
from scipy.spatial import distance
a = (1, 2, 3)
b = (4, 5, 6)
dst = distance.euclidean(a, b)
#6楼
这是一些Python中的欧几里得距离的简洁代码,给出了用Python列表表示的两个点。
def distance(v1,v2):
return sum([(x-y)**2 for (x,y) in zip(v1,v2)])**(0.5)
#7楼
我喜欢np.dot
(点积):
a = numpy.array((xa,ya,za))
b = numpy.array((xb,yb,zb))
distance = (np.dot(a-b,a-b))**.5
#8楼
在定义a
和b
同时,还可以使用:
distance = np.sqrt(np.sum((a-b)**2))
#9楼
一个不错的单线:
dist = numpy.linalg.norm(a-b)
但是,如果需要考虑速度,建议您在计算机上进行实验。 我发现在我的机器上,将math
库的sqrt
与**
运算符一起使用,比单行NumPy解