2016-08-29 7 views
2

나는 [(1,2),(3,4),(5,6),(7,8)] 점 목록으로 작업하고 있습니다. 각 지점에서 목록의 다른 모든 지점까지 유클리드 거리를 찾고 싶습니다.Python : for 루프를 사용하여 float의 중첩 목록 만들기

다음 원래 목록의 각 지점을 나타내는 새 목록이 필요하며 새 목록에서 해당 지점과 관련된 거리 만 추가합니다.

지금까지 내가 가진 : mat_ary1

i
for i in mat_ary1: 
    points_dist_i = [] 
    for j in i: 
     row = [] 
     x2 = [u[0] for u in i] 
     y2 = [u[1] for u in i] 
     # Calculate the distance from point j to all others 
     for a in x2: 
      dist_x_1 = pow((a - j[0]),2)  
     for b in y2:   
      dist_y_1 = pow((b - j[1]),2) 
      dist_xy_1 = float('{0:.2f}'.format((math.sqrt(dist_x_1 + dist_y_1)))) 

      for item in j: 
       if item not in row: 
        row.append(dist_xy_1) 
       else: 
        continue 
       points_dist_i.append(row) 

포인트의 목록을 나타냅니다. 루프를 사용하면 동일한 계산을 반복하는 것처럼 보입니다.

[[6.32, 6.32], [6.32, 6.32], [0.0, 0.0], [0.0, 0.0]] 
[[11.4, 11.4], [11.4, 11.4], [0.0, 0.0], [0.0, 0.0]] 
[[16.49, 16.49], [16.49, 16.49], [0.0, 0.0], [0.0, 0.0]] 
[[14.32, 14.32], [14.32, 14.32], [0.0, 0.0], [0.0, 0.0]] 
[[13.0, 13.0], [13.0, 13.0], [0.0, 0.0], [0.0, 0.0]] 
[[11.66, 11.66], [11.66, 11.66], [0.0, 0.0], [0.0, 0.0]] 
+0

나는 당신을 이해하도록하겠습니다. 우리는 두 점,'(1,2)'및 ((3,4))를 가지고 있다고 가정 해 봅시다. 그 두 점에 대해 '1'과 '3'사이의 거리를 찾고 싶습니다. 그리고'2'와'4'? –

+0

원하는 출력은 정확히 무엇입니까? –

+0

@ Mr.goosberry - 네, 그게 원 하긴하지만 내 목록 크기는 항상 달라집니다 – vanoccupanther

답변

3

이 근본적으로 다른 점 한 점에서의 거리 행렬을 만들어 다음과 같은 중첩 된 지능형리스트

>>> import math 
>>> [[math.hypot(point[0]-x, point[1]-y) for x,y in points] for point in points] 
[[0.0, 2.8284271247461903, 5.656854249492381, 8.48528137423857], 
[2.8284271247461903, 0.0, 2.8284271247461903, 5.656854249492381], 
[5.656854249492381, 2.8284271247461903, 0.0, 2.8284271247461903], 
[8.48528137423857, 5.656854249492381, 2.8284271247461903, 0.0]] 

를 사용할 수 있습니다

내 입력 행을 복제하는 것 같다 행 및 열 인덱스는 "시작"및 "끝"포인트이며,이 경우 행렬은 대각선에 대해 대칭이되고 대각선은 모두 0이됩니다.

+0

좋아,이 일을하고 내가 어떻게 일어나는지 보겠다. – vanoccupanther

+0

고마워, 그 사람은 대접 받았다. 루프를 위해서 저를 구해 주셨습니다! – vanoccupanther

2

Scikit-learn은이 정확한 문제에 대한 함수를 가지고 있으며 배열이 클 경우 가장 빠른 구현이 될 것입니다.

>>>>from sklearn.metrics.pairwise import pairwise_distances 
>>>>pairwise_distances(mat_ary1) 
array([[ 0.  , 2.82842712, 5.65685425, 8.48528137], 
    [ 2.82842712, 0.  , 2.82842712, 5.65685425], 
    [ 5.65685425, 2.82842712, 0.  , 2.82842712], 
    [ 8.48528137, 5.65685425, 2.82842712, 0.  ]]) 
+0

건배, 그걸 봐야 겠어. – vanoccupanther

관련 문제