高效地找到最接近的点,以便在网格数据上跟踪时空

问题描述

摘要/简化版本

给出由三个1维数组(latslonsdtime都具有相同长度)和网格3维数组{{1} }(由二维rrlat_radar坐标数组和一维时间数组lon_radar定义)我想提取time_radar中所有坐标的网格值(包括纬度,经度和时间)最接近三个一维数组。

我设法使用rr来选择空间中的点,但是我不知道如何将空间和时间的解决方案归纳在一起。现在,我必须分别按时进行选择,这会使代码非常庞大且难以阅读。

有关此问题的更多详细信息,请参见下文


扩展版本

我正在尝试开发一个应用程序,该应用程序使用从天气雷达复合材料获得的降水数据来预测沿轨道的降水。大多数应用程序通常在不考虑时间点移动的情况下预测某一点的降水量。

这个想法是,给定识别空间和时间轨迹的点,从雷达数据中找到最接近的网格点,以获得该轨迹上的降水量估计值(请参见图)。最终目标将是改变开始时间,以找出避免下雨的最佳离开时间。

我刚刚优化了我以前的算法,即使用纯循环,以使用cKDTree中的cKDTree。执行时间从30s减少到380ms :)。但是我认为代码仍然可以优化。这是我的尝试。

作为输入

  • scipylons:轨道的坐标为N维数组
  • latsdtime包含轨道上经过时间的T维数组
  • timedeltalon_radar:包含雷达数据坐标的M x P矩阵
  • lat_radardtime_radar包含雷达预报的Q维数组
  • timedelta:包含每个时间步长的雷达预报的M x P X Q阵列

首先使用rr找到最接近轨迹的网格点:

cKDTree

然后在轨道中找到最接近的点对其进行子集化。如果雷达每公里只有一个栅格点,那么拥有10 m的航迹分辨率是没有意义的。

combined_x_y_arrays = np.dstack([lon_radar.ravel(),lat_radar.ravel()])[0]
points_list = list(np.vstack([lons,lats]).T)

def do_kdtree(combined_x_y_arrays,points):
    mytree = cKDTree(combined_x_y_arrays)
    dist,indexes = mytree.query(points)
    return indexes

results = do_kdtree(combined_x_y_arrays,points_list)
# As we have many duplicates,since the itinerary has a much higher resolution than the radar,# we only select the unique points 
inds_itinerary = np.unique(results)
lon_lat_itinerary = combined_x_y_arrays[inds_itinerary]

现在我们可以使用这些位置获取轨迹上的经过时间以及雷达数据中的相对时间步长

combined_x_y_arrays = np.vstack([lons,lats]).T
points_list = list(lon_lat_itinerary)

results = do_kdtree(combined_x_y_arrays,points_list)

现在,我们拥有找到降水所需的一切,因此我们只需要最后一个循环。我还在dtime_itinerary = dtime[results] # find indices of these dtimes in radar dtime inds_dtime_radar = np.abs(np.subtract.outer(dtime_radar,dtime_itinerary)).argmin(0) 上循环以获取具有不同开始时间的预测。

shifts

特别是,我想找到一种将时间搜​​索与经纬度搜索相结合的方法来寻找最接近的点。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...