使用2D Lat和Lon Python的最近邻或KD树

时间:2017-11-01 17:55:33

标签: python algorithm multidimensional-array nearest-neighbor satellite-image

我想做什么:

我想要做的是为最近邻居提供一个功能,用户提供纬度和经度数组以及奇点。在函数中我不介意从不同的库(例如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而没有运气,因为我不理解如何正确使用库。

我已经进行了广泛的搜索,试图找到解决我的问题的解决方案,但没有优先权,所以我没有选择,现在正在向社区提问。

0 个答案:

没有答案