norm 是一个函数,它将向量作为输入并返回一个标量值,该值可以解释为该向量的“大小”、“长度”或“大小”。更正式地说,规范被定义为具有以下数学属性:
- 它们以乘法方式缩放,即 Norm(a·v) = |a|·Norm(v) 用于任何标量 一个
- 它们满足三角不等式,即Norm(u + v) ≤ Norm(u) + Norm(v)
- 向量的范数为零当且仅当它是零向量,即 Norm(v) = 0 ⇔ v = 0
欧几里得范数(也称为 L² 范数)只是许多不同范数中的一种 - 还有最大范数、曼哈顿范数等。单个向量的 L² 范数相当于到该点的欧几里得距离到原点,两个向量之差的L²范数等于两点之间的欧几里得距离。
正如 @nobar 的回答所说,np.linalg.norm(x - y, ord=2)(或只是 np.linalg.norm(x - y))将为您提供向量 x 和 y 之间的欧几里得距离。
由于您想计算a[1, :] 和a 中的每一行之间的欧几里得距离,您可以通过消除for 循环并在a 的行上广播来更快地完成此操作:
dist = np.linalg.norm(a[1:2] - a, axis=1)
使用广播自己计算欧几里得距离也很容易:
dist = np.sqrt(((a[1:2] - a) ** 2).sum(1))
最快的方法大概是scipy.spatial.distance.cdist:
from scipy.spatial.distance import cdist
dist = cdist(a[1:2], a)[0]
(1000, 1000) 数组的一些计时:
a = np.random.randn(1000, 1000)
%timeit np.linalg.norm(a[1:2] - a, axis=1)
# 100 loops, best of 3: 5.43 ms per loop
%timeit np.sqrt(((a[1:2] - a) ** 2).sum(1))
# 100 loops, best of 3: 5.5 ms per loop
%timeit cdist(a[1:2], a)[0]
# 1000 loops, best of 3: 1.38 ms per loop
# check that all 3 methods return the same result
d1 = np.linalg.norm(a[1:2] - a, axis=1)
d2 = np.sqrt(((a[1:2] - a) ** 2).sum(1))
d3 = cdist(a[1:2], a)[0]
assert np.allclose(d1, d2) and np.allclose(d1, d3)