假设我有一个矩阵nxm容纳行向量。我想要一个距离矩阵nxn,它表示每个矢量相互之间的距离。我如何使用Numpy在Python中执行此操作。我知道Scipy会这样做,但我想要我的手。我已经写了一个余弦相似函数cos_dist(a,b)
,其中a和b是两个不同的向量。现在我需要一个调用函数,它可以有效地为每个项目执行此操作。我该怎么办?
答案 0 :(得分:3)
以下代码显示了执行您所需操作的两个选项。一个循环遍历数组两次并使用Python函数计算cos_dist。第二种方法使用矢量化方法和broadcasting来更快地获得相同的结果x1000。
from __future__ import division
import numpy as np
def cos_dist(a, b):
mod_a = np.sqrt(a.dot(a))
mod_b = np.sqrt(b.dot(b))
return a.dot(b) / mod_a / mod_b
a = np.random.rand(100, 4)
# Slow option
def slow_dist(a):
items = a.shape[0]
out_slow = np.ones((items,items))
for j in xrange(items):
for k in xrange(j+1, items):
out_slow[j, k] = cos_dist(a[j], a[k])
out_slow[k, j] = out_slow[j, k]
return out_slow
# Faster option
from numpy.core.umath_tests import inner1d
def fast_dist(a):
mod_a = np.sqrt(inner1d(a ,a))
norm_a = a / mod_a[:, None]
out_fast = inner1d(norm_a[:, None, :],
norm_a[None, :, :])
return out_fast
以下是时间安排:
In [2]: %timeit slow_dist(a)
10 loops, best of 3: 67.6 ms per loop
In [3]: %timeit fast_dist(a)
10000 loops, best of 3: 60.5 us per loop
In [4]: np.allclose(slow_dist(a), fast_dist(a))
Out[4]: True
答案 1 :(得分:2)
为什么不检查scipy的spatial.distance.pdist()
,它计算n维空间中观测值之间的成对距离,并有大量的距离函数可供选择?
由于您没有安装scipy并希望使用numpy进行编码,我建议您学习its source code,该文档链接在其文档页面的左上角。