我正在尝试做的事情:
我想要做的是有一个最近邻居的功能,用户提供纬度和经度数组和一个奇点。在函数中,我不介意应用来自不同库(例如 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]
我发现这个链接解释了如何使用纬度和经度坐标执行 kd 树,但纬度和经度也是一维的。
我想返回索引,因为我在后面的步骤中将它应用于我的 lat、lon 和 data 数组。
所以我的一般问题是任何人都可以解释/提供一个示例(或链接),说明如何为指定的纬度和经度坐标(例如 36.538537 N,126.330194 E)提取特定数量的邻居(在本例中为 4),前提是纬度和经度数组是二维的(即我需要从中提取邻居的数据集)。
如果有用,我正在处理卫星可见数据。
我已经尝试过:
以前我曾尝试解开数组(如上所示),这就是我发现它效率极低的原因。我也让它返回 True/False 值,然后查找我的数组在哪里是 True,但这比第一种方法效率更低。我尝试使用 heapq 库中的 nsmallest 没有运气,因为我不明白如何正确使用该库。
我进行了广泛的搜索,试图为我的问题找到解决方案,但没有成功,所以我没有选择,现在正在询问社区。