在三维空间中有两个点

a = (ax, ay, az)
b = (bx, by, bz)

我想计算它们之间的距离:

dist = sqrt((ax-bx)^2 + (ay-by)^2 + (az-bz)^2)

我如何用NumPy做到这一点?我有:

import numpy
a = numpy.array((ax, ay, az))
b = numpy.array((bx, by, bz))

当前回答

使用numpy.linalg.norm:

dist = numpy.linalg.norm(a-b)

这是因为欧氏距离是l2范数,而numpy.linalg.norm中ord参数的默认值是2。 要了解更多理论,请参阅数据挖掘介绍:

其他回答

其他答案适用于浮点数,但不能正确计算整数dtype的距离,因为整数dtype容易溢出和下溢。注意,即使scipy.distance.euclidean也有这个问题:

>>> a1 = np.array([1], dtype='uint8')
>>> a2 = np.array([2], dtype='uint8')
>>> a1 - a2
array([255], dtype=uint8)
>>> np.linalg.norm(a1 - a2)
255.0
>>> from scipy.spatial import distance
>>> distance.euclidean(a1, a2)
255.0

这是很常见的,因为许多图像库将图像表示为dtype="uint8"的ndarray。这意味着,如果你有一个由深灰色像素组成的灰度图像(比如所有像素的颜色都是#000001),你将它与黑色图像(#000000)进行区分,你最终可以在所有单元格中得到x-y为255的图像,这表明两张图像彼此相距很远。对于无符号整数类型(例如uint8),你可以安全地在numpy中计算距离:

np.linalg.norm(np.maximum(x, y) - np.minimum(x, y))

对于有符号整型,可以先转换为浮点类型:

np.linalg.norm(x.astype("float") - y.astype("float"))

对于图像数据,你可以使用opencv的norm方法:

import cv2
cv2.norm(x, y, cv2.NORM_L2)

对于大量的距离,我能想到的最快的解决方案是使用numexpr。在我的机器上,它比使用numpy einsum更快:

import numexpr as ne
import numpy as np
np.sqrt(ne.evaluate("sum((a_min_b)**2,axis=1)"))

我在matplotlib中找到了一个“dist”函数。mlab,但我认为它不够方便。

我把它贴在这里只是为了参考。

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)

我喜欢np。点(点积):

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

distance = (np.dot(a-b,a-b))**.5

这个公式很容易用

distance = np.sqrt(np.sum(np.square(a-b)))

它实际上只是使用毕达哥拉斯定理来计算距离,通过将Δx, Δy和Δz的平方相加,并对结果进行根运算。