2012-11-03 73 views
3

我有一個40 * 4矩陣M和一個包含40個元素的向量A。我想計算A與M中每個列向量之間的餘弦距離。將函數映射到Scipy/numpy矩陣的所有列

我真的需要這樣寫嗎?

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

謝謝!

+1

你能告訴M.shape列和A.shape輸出。對於(40,4),(40,1),您的代碼提供1x1列表而不是4x1。對於其他變體 - 對齊錯誤。更好的意味着更快,更美麗還是別的什麼? – adray

回答

2

也許更實用的方法是使用functools.partialcosine第二個參數綁定到A,然後使用map這個約束功能適用於M

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

看來,根據this question,Numpy有一種Pythonic方法來迭代矩陣的列。這樣,你可以寫:

print [cosine(column,A) for column in M.transpose()] 
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

+1

如果效率很重要,則此解決方案比其他解決方案快5倍 –