2016-08-29 9 views
2

私は点のリストを使って作業しています[(1,2),(3,4),(5,6),(7,8)]。私は各点からリストの他の点までのユークリッド距離を求めたい。Python:forループを使ってfloatのネストされたリストを作成する

元のリストの各ポイントを表すために新しいリストを作成する必要があります。新しいリストでは、そのポイントのみに関連する距離を追加します。

これまでのところ、私が持っている:mat_ary1

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) 

iは点のリストを表します。私が使用しているループでは、同じ計算を繰り返すように見えます。

私の入力が行を複製しているようだ:

[[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)」という2つのポイントがあるとします。これら2つの点については、「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]] 

これは本質的に任意の他のポイントへの一点からの距離に行列を作ります行と列のインデックスは "from"と "to"の点であり、この場合行列は対角線についても対称であり、対角はすべてゼロになります。

+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

関連する問題