说我有一个向量v1
和一个向量l1
列表。我希望从k
中找到l1
向量,这些向量与v1
的关闭最为封闭(类似)。
我有一个函数sim_score(v1,v2)
,对于任何两个输入向量,它将返回0到1之间的相似度分数。
实际上,一种天真的方式是在for
上写一个l1
循环,计算距离并将它们存储到另一个列表中,然后对输出列表进行排序。但有没有Pythonic方法来完成任务?
由于
答案 0 :(得分:1)
import numpy as np
np.sort([np.sqrt(np.sum(( l-v1)*(l-v1))) For l in l1])[:3]
答案 1 :(得分:1)
考虑使用scipy.spatial.distance模块进行距离计算。它支持最常见的指标。
import numpy as np
from scipy.spatial import distance
v1 = [[1, 2, 3]]
l1 = [[11, 3, 5],
[ 2, 1, 9],
[.1, 3, 2]]
# compute distances
dists = distance.cdist(v1, l1, metric='euclidean')
# sorted distances
sd = np.sort(dists)
请注意,cdist
的每个参数都必须是二维的。因此,v1
必须是嵌套列表,或者是2d numpy数组。
您也可以使用自己开发的指标,如:
def my_metric(a, b, **kwargs):
# some logic
dists = distance.cdist(v1, l1, metric=my_metric)