我有以下函数来获得两个向量a
和b
之间的欧几里德距离。
def distance_func(a,b):
distance = np.linalg.norm(b-a)
return distance
在这里,我希望a
成为向量数组的元素。所以我使用numpy vectorize迭代数组。 (为了获得比使用for循环迭代更好的速度)
vfunc = np.vectorize(distance_func)
我使用以下方法获得欧几里德距离数组
a = np.array([[1,2],[2,3],[3,4],[4,5],[5,6]])
b = np.array([1,2])
vfunc(a,b)
但是这个函数返回:
数组([[0.,0。], [1.,1。], [2.,2。], [3.,3。], [4.,4。]])
这是对第二个向量分别执行操作np.linalg.norm(a-b)
的结果。
如何使用numpy vectorize以这种方式获取欧几里德距离数组?
答案 0 :(得分:4)
您不需要使用vectorize
,您可以这样做:
a = np.array([[1,2],[2,3],[3,4],[4,5],[5,6]])
b = np.array([1,2])
np.linalg.norm(a-b, axis=1)
给出:
[ 0. 1.41421356 2.82842712 4.24264069 5.65685425]
(我认为这是你想要的,但如果没有,请同时展示你期望的结果。)
答案 1 :(得分:1)
如果您想计算所有数据点之间的欧氏距离,您应该使用为此效果提供的功能之一
from sklearn.metrics import euclidean_distances
from scipy.spatial import distance_matrix
它们经过优化,可以完全向量化的方式计算几个点a
到几个点b
的距离。
import numpy as np
a = np.random.randn(100, 2)
b = np.random.randn(200, 2)
d1 = euclidean_distances(a, b)
d2 = distance_matrix(a, b, p=2)
print d1.shape # yields (100, 200), one distance for each possible couple
print d2.shape
速度考虑
In [90]: %timeit d1 = euclidean_distances(a, b)
1000 loops, best of 3: 403 us per loop
In [91]: %timeit d2 = distance_matrix(a, b, p=2)
1000 loops, best of 3: 699 us per loop