4

複数の (x,y) 順序付けられたペアが与えられた場合、それぞれの距離を比較したいと思います。だから私は順序付けられたペアのリストを持っているふりをします:

pairs = [a,b,c,d,e,f]

私は2つの順序付けられたペアを取り、それらの間の距離を見つける関数を持っています:

def distance(a,b):
    from math import sqrt as sqrt
    from math import pow as pow
    d1 = pow((a[0] - b[0]),2)
    d2 = pow((a[1] - b[1]),2)
    distance = sqrt(d1 + d2)
    return distance

この関数を使用して、すべての順序付きペアを他のすべての順序付きペアと比較し、最終的にそれらの間の距離が最大の 2 つの順序付きペアを見つけるにはどうすればよいですか?

擬似擬似コード:

     distance(a,b)
     distance(a,c)
     ...
     distance(e,f)

どんな助けでも大歓迎です。

4

5 に答える 5

17

Python 2.6 では、itertools.permutations を使用できます

import itertools
perms = itertools.permutations(pairs, 2)
distances = (distance(*p) for p in perms)

また

import itertools
combs = itertools.combinations(pairs, 2)
distances = (distance(*c) for c in combs)
于 2009-04-08T04:51:52.877 に答える
10
try:

    from itertools import combinations

except ImportError:

    def combinations(l, n):
        if n != 2: raise Exception('This placeholder only good for n=2')
        for i in range(len(l)):
            for j in range(i+1, len(l)):
                yield l[i], l[j]


coords_list = [(0,0), (3,4), (6,8)]

def distance(p1, p2):
    return ( ( p2[0]-p1[0] ) ** 2 + ( p2[1]-p1[1] )**2 ) ** 0.5

largest_distance, (p1, p2) = max([
     (distance(p1,p2), (p1, p2)) for (p1,p2) in combinations(coords_list, 2)
     ])


print largest_distance, p1, p2
于 2009-04-08T04:47:59.810 に答える
6

試す:

max(distance(a, b) for (i, a) in enumerate(pairs) for b in pairs[i+1:])

これにより、同一性比較 ( 、 など) が回避さdistance(x, x)distance(y, y)ます。また、distance(x, y) == distance(y, x).


更新: Evgeny のソリューションitertoolsは、あなたがやろうとしていることをより簡潔に表現するので、もう少しうまく使用するのが好きです。どちらのソリューションも同じことを行います。(注:順列ではなく、必ず組み合わせを使用してください。これは非常に遅くなります!)

于 2009-04-08T04:54:37.737 に答える
4

少し関連していますが、ユークリッド距離を自分で計算する必要はありません。math.hypot があります。

In [1]: a = (1, 2)
In [2]: b = (4, 5)
In [3]: hypot(a[0]-b[0], a[1]-b[1])
Out[3]: 4.2426406871192848
于 2009-04-08T17:26:06.963 に答える
3

2 回同じである 2 点間の距離計算を気にしない場合は、次のようにして最大距離を見つけます。

max( [distance(a, b) for a in pairs for b in pairs] )

代わりに a と b のペアを作成するには、次の手順を実行します。

import operator
max( [((a,b), distance(a, b)) for a in pairs for b in pairs], key=operator.itemgetter(1))

これを John Feminella のソリューションと組み合わせて、余分な距離比較を行わずに (a,b) タプルを取得できます

于 2009-04-08T04:48:20.933 に答える