从以前的字典中设置一个新的键值字典
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>)
对于大量代码转储,我们深表歉意。我的问题是我最后一个 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>)