在三维空间中有两个点

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。 要了解更多理论,请参阅数据挖掘介绍:

其他回答

我在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)

从Python 3.8开始,math模块直接提供dist函数,它返回两点之间的欧几里得距离(以元组或坐标列表的形式给出):

from math import dist

dist((1, 2, 6), (-2, 3, 2)) # 5.0990195135927845

如果你使用列表:

dist([1, 2, 6], [-2, 3, 2]) # 5.0990195135927845

使用Python 3.8,这非常简单。

https://docs.python.org/3/library/math.html#math.dist

math.dist(p, q)

返回给定两点p和q之间的欧氏距离 作为坐标序列(或可迭代对象)。这两点一定有 相同的维度。 大致相当于: √(sum((px - qx) ** 2.0 for px, qx in zip(p, q)))

计算多维空间的欧氏距离:

 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

其他答案适用于浮点数,但不能正确计算整数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)