将函数映射到Scipy / numpy矩阵的所有列

时间:2012-11-03 15:10:24

标签: python numpy scipy

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

我真的需要这样写吗?

 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

谢谢!

3 个答案:

答案 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.partialcosine的第二个参数绑定到A,然后使用map将此绑定函数应用于列M

map(partial(cosine,v=A), M.transpose())