2016-06-14 132 views
0

對不起,大代碼轉儲。我的問題是與我的最後一個循環。我試圖建立一個新的字典,「候選人」,它包含一個網站與另一個網站的所有可能的組合,映射到它們之間的距離。例如,假設網站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 

使用haversine公式

 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:

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

從答案採取1

closest_site將元組:(<ID of closest site>, <distance>)

請寫,如果你需要更多的內存高效的解決方案。這不是最佳的,因爲會生成雙倍大小的數據。

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

很好,謝謝!有沒有辦法讓nearest_site輸出原始網站,所以我知道哪個網站是家,哪個網站是最近的網站?否則,如果我做類似candidates.get(site1,{})的東西,我會得到所有最近的鄰居ID,但不是原始站點號。非常酷的想法,但字典詞典! – Ravmcgav

相關問題