从以前的字典中设置一个新的键值字典

setting up a new key value dictionary from a previous one

对于大量代码转储,我们深表歉意。我的问题是我最后一个 for 循环。我正在尝试建立一个新字典 "candidates,",其中包含一个站点与另一个站点的所有可能组合,并映射到它们之间的距离。例如,假设站点 1 的 ID 为 1234,站点 2 的 ID 为 1235,站点 3 的 ID 为 1236。我希望候选字典最终成为 {'1234_1235' : distance, '1234_1236' : distance},即从一个站点到其他站点的所有可能组合。这些组合已经包含在dictkey中;我只需要重组它们。这样我就可以弹出最短距离,并最终得到每个站点的 "nearest neighbor" 列表。

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]

实现它的最简单方法是在计算距离时准备候选人。只需准备候选人的字典而不是 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>)

如果您需要更高效的内存解决方案,请写信。这不是最优的,因为生成双倍大小的数据。

更新

如果需要获取原始站点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>)