2014-02-25 3 views
0

다음과 같이 두 개의 numpy 배열이 있습니다.두 개의 numpy 배열로 유클리드 거리를 계산하십시오.

X = np.array([-0.34095692,-0.34044722,-0.27155318,-0.21320583,-0.44657865,-0.19587836, -0.29414279, -0.3948753 ,-0.21655774 , -0.34857087]) 
Y = np.array([0.16305762,0.38554548, 0.10412536, -0.57981103, 0.17927523, -0.22612216, -0.34569697, 0.30463137,0.01301744,-0.42661108]) 

이들은 10 명의 사용자 x와 y의 조정입니다. 각 사용자 간의 유사성을 찾아야합니다. 예를 들어 이를 달성 도와주세요 :

x1 = -0.34095692 
y1 = 0.16305762 
x2 = -0.34044722 
y2 = 0.38554548 

Euclidean distance = (|x1-y1|^2 + |x2-y2|^2)^1/2 

그래서 결국 나는 다음과 같이 행렬을 얻을합니다. 작업을 수행

enter image description here

+1

좋은 소리입니다. 질문은 무엇입니까? –

+0

@Jonathon Reinhart : 저는 이것을 시작하는 것에 대해 모릅니다? 어떤 도움이 필요합니까? –

+1

한숨, [Google] (http://www.google.com/search?q=numpy+euclidean+distance)을 묻는 것을 고려 했습니까? 그것은 [이 성공적으로 답변 된 질문] (http://stackoverflow.com/questions/1401712/calculate-euclidean-distance-with-numpy)으로 직접 안내합니다. –

답변

2

사용 zip(X, Y)는 좌표 쌍을 얻을, 당신은 점 사이의 유클리드 거리를 얻을 싶다면, 그것은 (|x1-x2|^2+|y1-y2|^2)^0.5하지 (|x1-y1|^2 - |x2-y2|^2)^1/2해야한다 :

In [125]: coords=zip(X, Y) 

In [126]: from scipy import spatial 
    ...: dists=spatial.distance.cdist(coords, coords) 

In [127]: dists 
Out[127]: 
array([[ 0.  , 0.22248844, 0.09104884, 0.75377329, 0.10685954, 
     0.41534165, 0.5109039 , 0.15149362, 0.19490308, 0.58971785], 
     [ 0.22248844, 0.  , 0.28973034, 0.9737061 , 0.23197262, 
     0.62852005, 0.73270705, 0.09751671, 0.39258852, 0.81219719], 
     [ 0.09104884, 0.28973034, 0.  , 0.68642072, 0.19047682, 
     0.33880688, 0.45038919, 0.23539542, 0.1064197 , 0.53629553], 
     [ 0.75377329, 0.9737061 , 0.68642072, 0.  , 0.79415038, 
     0.35411306, 0.24770988, 0.90290761, 0.59283795, 0.20443561], 
     [ 0.10685954, 0.23197262, 0.19047682, 0.79415038, 0.  , 
     0.47665258, 0.54665574, 0.13560014, 0.28381556, 0.61376196], 
     [ 0.41534165, 0.62852005, 0.33880688, 0.35411306, 0.47665258, 
     0.  , 0.15477091, 0.56683251, 0.24003205, 0.25201351], 
     [ 0.5109039 , 0.73270705, 0.45038919, 0.24770988, 0.54665574, 
     0.15477091, 0.  , 0.65808357, 0.36700881, 0.09751671], 
     [ 0.15149362, 0.09751671, 0.23539542, 0.90290761, 0.13560014, 
     0.56683251, 0.65808357, 0.  , 0.34181257, 0.73270705], 
     [ 0.19490308, 0.39258852, 0.1064197 , 0.59283795, 0.28381556, 
     0.24003205, 0.36700881, 0.34181257, 0.  , 0.45902146], 
     [ 0.58971785, 0.81219719, 0.53629553, 0.20443561, 0.61376196, 
     0.25201351, 0.09751671, 0.73270705, 0.45902146, 0.  ]]) 

이 배열의 상단 삼각형을 얻으려면 numpy.triu :

을 사용하십시오.
In [128]: np.triu(dists) 
Out[128]: 
array([[ 0.  , 0.22248844, 0.09104884, 0.75377329, 0.10685954, 
     0.41534165, 0.5109039 , 0.15149362, 0.19490308, 0.58971785], 
     [ 0.  , 0.  , 0.28973034, 0.9737061 , 0.23197262, 
     0.62852005, 0.73270705, 0.09751671, 0.39258852, 0.81219719], 
     [ 0.  , 0.  , 0.  , 0.68642072, 0.19047682, 
     0.33880688, 0.45038919, 0.23539542, 0.1064197 , 0.53629553], 
     [ 0.  , 0.  , 0.  , 0.  , 0.79415038, 
     0.35411306, 0.24770988, 0.90290761, 0.59283795, 0.20443561], 
     [ 0.  , 0.  , 0.  , 0.  , 0.  , 
     0.47665258, 0.54665574, 0.13560014, 0.28381556, 0.61376196], 
     [ 0.  , 0.  , 0.  , 0.  , 0.  , 
     0.  , 0.15477091, 0.56683251, 0.24003205, 0.25201351], 
     [ 0.  , 0.  , 0.  , 0.  , 0.  , 
     0.  , 0.  , 0.65808357, 0.36700881, 0.09751671], 
     [ 0.  , 0.  , 0.  , 0.  , 0.  , 
     0.  , 0.  , 0.  , 0.34181257, 0.73270705], 
     [ 0.  , 0.  , 0.  , 0.  , 0.  , 
     0.  , 0.  , 0.  , 0.  , 0.45902146], 
     [ 0.  , 0.  , 0.  , 0.  , 0.  , 
     0.  , 0.  , 0.  , 0.  , 0.  ]]) 
+0

대단히 감사합니다! 마침내 그것을 발견했다. 다시 한번 고마워. :) –

+0

@NilaniAlgiriyage, 기꺼이 도와 드리겠습니다, np;) – zhangxaochen

2

짧은 조각 :

A = (X-Y)**2 
p, q = np.meshgrid(np.arange(10), np.arange(10)) 
np.sqrt(A[p]-A[q]) 

편집 : 설명

  1. A는 모든 차이를 제곱에 불과 미리 계산 된 벡터이다.
  2. 마법은 np.meshgrid에 있습니다.이 함수의 목적은 다른 배열을 견인하여 모든 쌍의 값을 생성하는 것입니다. 이것은 전체 매트릭스를 얻을 수 있기 때문에 최상의 솔루션은 아니지만 보유하고있는 표본의 수에는 큰 차이가 없습니다. 생성 된 값은 A의 인덱스와 일치합니다.
  3. 인덱싱 부분 A[p]도 약간의 마술입니다. 그것의 행동을 이해하기 위해 직접 시도하십시오.
  4. 여기 매트릭스는 nan으로 가득하지만 그게 당신이 요구하는 것입니다. 진정한 유클리드 거리는 +이 아니라 -입니다.

페이지 & Q :

array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]) 

array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 
    [2, 2, 2, 2, 2, 2, 2, 2, 2, 2], 
    [3, 3, 3, 3, 3, 3, 3, 3, 3, 3], 
    [4, 4, 4, 4, 4, 4, 4, 4, 4, 4], 
    [5, 5, 5, 5, 5, 5, 5, 5, 5, 5], 
    [6, 6, 6, 6, 6, 6, 6, 6, 6, 6], 
    [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], 
    [8, 8, 8, 8, 8, 8, 8, 8, 8, 8], 
    [9, 9, 9, 9, 9, 9, 9, 9, 9, 9]]) 
+0

이것은 좋은 일입니다! 나는 이것의 정확성을 확인하지 못한다. 이걸 설명해 주시겠습니까? 어떤 방법으로나 많은 nans가 맞습니까? –

+0

자세한 답변을 주셔서 감사합니다. 예, 그 질문은 + 업데이트되어 있어야합니다.내가 얻지 못하는 마지막 질문,이 모든 'nans'의 의미는 무엇입니까? (그들은 더 가깝거나 더 분리되어 있습니까?) –

+0

차이가 음수 일 수 있습니다. 'sqrt'는 음수를'nan'으로 만듭니다. 올바른 수식을 사용하면이 '나노'를 얻지 못할 것입니다. – Kiwi