我有一個40 * 4矩陣M
和一個包含40個元素的向量A
。我想計算A
與M中每個列向量之間的餘弦距離。將函數映射到Scipy/numpy矩陣的所有列
我真的需要這樣寫嗎?
print [cosine(M[:,i],A) for i in range(A.shape[1])]
或者還有另一種更好的方法來做到這一點?
謝謝!
我有一個40 * 4矩陣M
和一個包含40個元素的向量A
。我想計算A
與M中每個列向量之間的餘弦距離。將函數映射到Scipy/numpy矩陣的所有列
我真的需要這樣寫嗎?
print [cosine(M[:,i],A) for i in range(A.shape[1])]
或者還有另一種更好的方法來做到這一點?
謝謝!
也許更實用的方法是使用functools.partial
到cosine
第二個參數綁定到A
,然後使用map
這個約束功能適用於M
map(partial(cosine,v=A), M.transpose())
看來,根據this question,Numpy有一種Pythonic方法來迭代矩陣的列。這樣,你可以寫:
print [cosine(column,A) for column in M.transpose()]
看來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
。
如果效率很重要,則此解決方案比其他解決方案快5倍 –
你能告訴M.shape列和A.shape輸出。對於(40,4),(40,1),您的代碼提供1x1列表而不是4x1。對於其他變體 - 對齊錯誤。更好的意味着更快,更美麗還是別的什麼? – adray