2012-11-03 3 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

의 열이 바인딩 기능을 적용 할 Acosine의 두 번째 인수를 바인딩 functools.partial를 사용하고 map을 사용하는 것입니다 및 A. 모양 출력. (40,4), (40,1)에 대한 코드는 4x1 대신 1x1 목록을 제공합니다. 다른 변종에 대해서 - 정렬과의 오류. 더 빨리, 더 아름답게 또는 다른 것을 의미합니까? – adray

답변

2

아마도 더 많은 기능 방법은 당신이 M.shape을 보여줄 수 M

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

this question에 따르면 Numpy는 행렬의 열을 반복하는 Python 방식을 사용합니다. 이 방법, 당신은 쓸 수 :

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 배 빠릅니다. –

관련 문제