2016-06-14 12 views
0

大きなコードをダンプして申し訳ありません。私の問題は私の最後のforループです。私は、あるサイトと他のサイトとの可能な組み合わせをすべて含み、それらの間の距離にマップされた新しい辞書「候補者」を設定しようとしています。たとえば、サイト1にはID 1234、サイト2にはID 1235、サイト3にはID 1236があります。最終的に候補となるものは{'1234_1235':distance、 '1234_1236':distance}です。あるサイトから他のサイトへの可能な組み合わせ。これらの組み合わせはすでにdictkeyに含まれています。私はそれらを再編成する必要があります。これは最短距離を飛び越えることができ、最終的には各サイトの「最寄りの近隣」のリストを取得するためです。新しい鍵値辞書を前の鍵値辞書から設定する

for i in np.arange(num_sites): 
    lat1 = lat[i] 
    lon1 = lon[i] 
    site1=site[i] 
    rat1 = lat1*np.pi/180.0 
    ron1 = lon1*np.pi/180.0 
    for j in np.arange(i+1,num_sites): 
     lat2 = lat[j] 
     lon2 = lon[j] 
     site2= site[j] 
     rat2 = lat2*np.pi/180.0 
     ron2 = lon2*np.pi/180.0 

をachiveする最も簡単な方法は、距離を計算する時に候補を調製することである半正矢式

 d = 2.0*np.arcsin(np.sqrt((np.sin((rat1-rat2)/2))**2 + 
      np.cos(rat1)*np.cos(rat2)*(np.sin((ron1-ron2)/2))**2)) 

     # dist_arr[i,j] = 6371.0 * d 

     dictkey[site1+"_"+site2] = 6371.0*d 

temporary = set() 
for key in dictkey: 
    parts = key.split("_") 
    site_one = parts[0] 
    site_two = parts[1] 
    temporary.add(site_one) 
for temps in temporary: 
    candidates = dict() 
    for key in dictkey: 
     parts = key.split("_") 
     site_one = parts[0] 
     site_two = parts[1] 
     if site_one == temps: 
      candidates[site_one] = dictkey[key] 

答えて

0

を用いて距離を算出します。ただ、代わりにdict_keyの候補の辞書を準備:上記

candidates = {} 
for i in np.arange(num_sites): 
lat1 = lat[i] 
lon1 = lon[i] 
site1=site[i] 
rat1 = lat1*np.pi/180.0 
ron1 = lon1*np.pi/180.0 
for j in np.arange(i+1,num_sites): 
    lat2 = lat[j] 
    lon2 = lon[j] 
    site2= site[j] 
    rat2 = lat2*np.pi/180.0 
    ron2 = lon2*np.pi/180.0 

    d = 2.0*np.arcsin(np.sqrt((np.sin((rat1-rat2)/2))**2 + 
     np.cos(rat1)*np.cos(rat2)*(np.sin((ron1-ron2)/2))**2)) 


    distance = 6371.0*d 
    if site1 in candidates: 
     candidates[site1][site2] = distance 
    else: 
     candidates[site1] = {site2: distance} 

    if site2 in candidates: 
     candidates[site2][site1] = distance 
    else: 
     candidates[site2] = {site1: distance} 

ソリューションはあなたに他のすべてのサイトまでの距離に辞書と辞書候補を与えるだろう。もちろん、ダブルサイズのだ - それは1234-> 4567のために同じデータを格納し、4567 - > 1234

candidates.get('1234', {}).get('4567') == candidates.get('4567', {}).get('1234') 
>>True 

しかし、それは値を取得する簡単な方法を提供し、あなたが見るように。 1234年までの最低距離を持つサイト:あなたはより多くのメモリ効率的なソリューションを必要とする場合(<ID of closest site>, <distance>)

を入力してください:

import operator 
closest_site = sorted(candidates.get('1234', {}).items(), key=operator.itemgetter(1)) 

答えから取ら1

closest_siteはタプルになります。ダブルサイズのデータ​​を生成するため、これは最適ではありません。

UPDATE

あなたが最短距離サイトと一緒に元のサイトのIDを取得する必要がある場合:その後、

closest_site = (candidates.get('1234'),) + sorted(candidates.get('1234', {}).items(), key=operator.itemgetter(1)) 

closest_site:(<ID of original site>, <ID of closest site>, <distance>)

+0

グレート、ありがとう! closest_siteに元のサイトも出力する方法はありますか?そのため、どちらのサイトが自宅ですか、どちらのサイトが最も近いかわかりますか?そうでなければ、私はcandidates.get(site1、{})のような何かをすると、私はすべての最も近い隣人IDを取得しますが、元のサイト番号は取得しません。しかし、非常にクールなアイデア、辞書の辞書! – Ravmcgav

関連する問題