我想要做的是为最近邻居提供一个功能,用户提供纬度和经度数组以及奇点。在函数中我不介意从不同的库(例如scipy kdtree)应用函数。以前我应用了以下函数,该函数用于查找1D lat和lon数组的最近邻居:
import numpy as np
def find_index_of_nearest_xy(lat_array, lon_array, lat_point, lon_point, num_neighbors = 4):
dist = np.sqrt(np.abs((lon_array-lon_point)**2 + (lat_array - lat_point)**2))
sorted_dist = sorted(dist)
values = np.array(sorted_dist[:num_neighbors])
indices = np.in1d(dist,values)
return indices
我知道有一种更有效的方法可以找到最近点的索引,但这种方法对于我以前做过的应用程序来说很快。
我现在遇到的问题是我的功能仅在lat和lon为1D时有效。使用我的新数据集,我的lat和lon数组都是2D,每个都具有(5500,5500)的形状,因此对它进行散乱并应用我的函数效率非常低,因为我在3个月内每5分钟执行一次这种分析。这种方法的一个例子是:
#current_AERONET is a pandas dataframe with aeronet lat, lon, time, and AOT data
aeronet_lat = current_AERONET['Lat'].tolist()
aeronet_lon = current_AERONET['Lon'].tolist()
for ahi in ahi_files:
openfile = netcdf.netcdf_file(ahi, 'r')
ahi_lat = np.copy(np.squeeze(openfile.variables['lat'][:])) #(5500, 5500)
ahi_lon = np.copy(np.squeeze(openfile.variables['lon'][:])) #(5500,5500)
new_lat = np.ravel(lat) #(30250000,)
new_lon = np.ravel(lon) #(30250000,)
idx = find_index_of_nearest_xy(new_lat, new_lon, aeronet_lat, aeronet_lon)
current_lat = new_lat[idx]
current_lon = new_lon[idx]
我发现this link解释了如何使用lat和lon坐标执行kd树,但lat和lon再次是1D。
我想返回索引,因为我将在稍后的步骤中将它应用于我的lat,lon和数据数组。
所以我的一般问题是,任何人都可以解释/提供如何为指定的纬度和经度坐标提取特定数量的邻居(在本例中为4)的示例(或链接)(例如36.538537 N,126.330194 E )如果纬度和经度数组是2D(即我需要从中提取邻居的数据集)。
如果有用,我正在使用卫星可见数据。
以前我试图破坏数组(如上所示),这就是我发现它非常低效的方式。我还让它返回True / False值,然后查找我的数组为True的位置,但这比第一种方法效率更低。我试图从heapq库中使用nsmallest而没有运气,因为我不理解如何正确使用库。
我已经进行了广泛的搜索,试图找到解决我的问题的解决方案,但没有优先权,所以我没有选择,现在正在向社区提问。