我有一个40 * 4矩阵M
和一个带有40个元素的向量A
。我想计算A
与M中每个列向量之间的余弦距离。
我真的需要这样写吗?
print [cosine(M[:,i],A) for i in range(A.shape[1])]
或者还有另一种更好的方法吗?
谢谢!
答案 0 :(得分:2)
似乎根据this question,Numpy有一种Pythonic方法来迭代矩阵的列。这样,你可以写:
print [cosine(column,A) for column in M.transpose()]
答案 1 :(得分: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
。
答案 2 :(得分:2)
或许更实用的方法是使用functools.partial
将cosine
的第二个参数绑定到A
,然后使用map
将此绑定函数应用于列M
map(partial(cosine,v=A), M.transpose())