3

我有一个 40*4 矩阵M和一个A包含 40 个元素的向量。我想计算AM 中每个列向量之间的余弦距离。

我真的需要这样写吗?

 print [cosine(M[:,i],A) for i in range(A.shape[1])]

还是有另一种更好的方法来做到这一点?

余弦的文档可以在这里查看:http: //docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.cosine.html#scipy.spatial.distance.cosine

谢谢!

4

3 回答 3

2

根据这个问题,Numpy 似乎有一种 Pythonic 方式来迭代矩阵的列。这样,您可以编写:

print [cosine(column,A) for column in M.transpose()]
于 2012-11-03T17:28:27.657 回答
2

它似乎scipy.spatial.distance.cosine真的只适用于向量。要使用矢量化表达式有效地计算余弦距离,请执行

normM = np.sqrt((M ** 2).sum(axis=0))
normA = np.sqrt((A ** 2).sum())
cossim = np.dot(M.T, A) / (normM * normA)
dist = 1. - cossim

假设M.shape == (40,4),A.shape == (4,)和两者都不是np.matrix

于 2012-11-03T17:39:22.690 回答
2

也许更实用的方法是使用functools.partial绑定 to 的第二个参数,cosine然后A使用map将此绑定函数应用于M

map(partial(cosine,v=A), M.transpose())
于 2012-11-03T17:50:45.720 回答