2017-02-28 14 views
1

(x, y)平面内の2点間の距離を計算する式はfairly known and straightforwardです。Python:(x、y)平面の一群の点の平均距離

しかし、平均距離を計算したいnポイントの問題にアプローチするにはどうすればよいですか?

例:

import matplotlib.pyplot as plt 
x=[89.86, 23.0, 9.29, 55.47, 4.5, 59.0, 1.65, 56.2, 18.53, 40.0] 
y=[78.65, 28.0, 63.43, 66.47, 68.0, 69.5, 86.26, 84.2, 88.0, 111.0] 
plt.scatter(x, y,color='k') 
plt.show() 

enter image description here

距離を単にレンダリングされる:

import math 
dist=math.sqrt((x2-x1)**2+(y2-y1)**2) 

しかし、これは許可されていない繰り返しとの組み合わせの問題です。どのようにそれにアプローチする?

+1

前のものを。 –

+0

前のループをループすると計算が繰り返されます。10は2を選択し、45の組み合わせが得られます。 – FaCoffee

+0

時間複雑度は面白いでしょう –

答えて

6

itertools.combinationsは、繰り返しなしの組み合わせを与える:あなたの問題のため

>>> for combo in itertools.combinations([(1,1), (2,2), (3,3), (4,4)], 2): 
...  print(combo) 
... 
((1, 1), (2, 2)) 
((1, 1), (3, 3)) 
((1, 1), (4, 4)) 
((2, 2), (3, 3)) 
((2, 2), (4, 4)) 
((3, 3), (4, 4)) 

コード:ループへ

import math 
from itertools import combinations 

def dist(p1, p2): 
    (x1, y1), (x2, y2) = p1, p2 
    return math.sqrt((x2 - x1)**2 + (y2 - y1)**2) 

x = [89.86, 23.0, 9.29, 55.47, 4.5, 59.0, 1.65, 56.2, 18.53, 40.0] 
y = [78.65, 28.0, 63.43, 66.47, 68.0, 69.5, 86.26, 84.2, 88.0, 111.0] 

points = list(zip(x,y)) 
distances = [dist(p1, p2) for p1, p2 in combinations(points, 2)] 
avg_distance = sum(distances)/len(distances) 
4

あなたが点列上ループする必要がある場合:最後のステップで

from math import sqrt 

def avg_distance(x,y): 
    n = len(x) 
    dist = 0 
    for i in range(n): 
     xi = x[i] 
     yi = y[i] 
     for j in range(i+1,n): 
      dx = x[j]-xi 
      dy = y[j]-yi 
      dist += sqrt(dx*dx+dy*dy) 
    return 2.0*dist/(n*(n-1)) 

、我々はN ×(N-1)により総距離を分割/ 2あります

ので、我々が計算した距離の合計 ある
n-1 
--- 
\  n (n-1) 
/ i = ------- 
---  2 
i=1 

:結果。

ここでは、ポイントとそれ自体の間の距離を測定しません(もちろん、常に0です)。これは当然のことながら、あなたもそれらを数えないので、平均に影響を与えます。 N点がある与えられ

、このアルゴリズムは、O(N )で実行されます。

関連する問題