我已经阅读了此问题解答-knn with big sparse matrices in python,并且遇到了类似的问题。我的雷达数据稀疏数组,大小为125930,经度和纬度具有相同的形状。只有5%的数据不是NULL。其余全为NULL。
数据在球体上可用,因此我使用VPTree和大圆距离来计算距离。网格间距是不规则的,我想将此数据插值到球面上的规则网格中,该球面在纬度和经度方向上的距离为0.05度。在粗网格中,两个纬度之间的间距为0.01,两个经度之间的间距为0.09。因此,我按照以下方式创建了网格网格,并且我具有以下网格点数-基于不规则网格的经度和纬度的最大值,总计为12960000。
latGrid = np.arange(minLat,maxLat,0.05)
lonGrid = np.arange(minLo,maxLo,0.05)
gridLon,gridLat = np.meshgrid(lonGrid,latGrid)
grid_points = np.c_[gridLon.ravel(),gridLat.ravel()]
radar_data = radar_element[np.nonzero(radar_element)]
lat_surface = lat[np.nonzero(radar_element)]
lon_surface = lon[np.nonzero(radar_element)]
points = np.c_[lon_surface,lat_surface]
if points.size > 0:
tree = vptree.VPTree(points,greatCircleDistance)
for grid_point in (grid_points):
indices = tree.get_all_in_range(grid_point,4.3)
args.append(indices)
问题是查询
get_all_in_range
以上数据的每次通过目前需要12分钟才能运行,我总共有175次通过,总时间为35小时,这是不可接受的。是否有任何方法可以减少网格点的数量(基于由于返回的大部分索引为null,因此发送给查询的一些相似性?我还使用了Scikit-learn的BallTree,其性能甚至比这还差。我不确定FLANN是否适合解决我的问题。
答案 0 :(得分:1)
我只需要转换为3D坐标并使用欧几里得距离即可。
您可以使用类似Annoy的信息(披露:我是作者)
答案 1 :(得分:1)
我首先将您的雷达观测值作为纬度/经度放入空间索引中。为了使用Python,让我们使用R-Tree。我会遵循这个概念:
http://toblerity.org/rtree/tutorial.html#using-rtree-as-a-cheapo-spatial-database
加载您的雷达观测结果:
for id, (y, x, m) in enumerate(observations):
index.insert(id=id, bounds=(x, y, x, y), obj=(y,x,m))
然后根据您想要的大圆距,我将计算一个“安全的”欧几里德距离以滤除候选点。
您可以在R树中查询输出网格点(x,y)附近的候选点:
candidates = idx.intersection((x - safe_distance, y - safe_distance, x + safe_distance, y+safe distance), objects=True)]
这将为您提供候选点列表,[(y, x, m),...]
现在使用Great Circle计算过滤候选对象。然后,您可以对其余的点对象进行插值。