2016-06-14 97 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

相关问题