在不规则网格上进行插值
所以,我有三个 numpy 数组,它们在网格上存储纬度、经度和一些属性值——也就是说,我有 LAT(y,x)、LON(y,x) 和温度 T(y,x) ),对于 x 和 y 的某些限制。网格不一定是规则的——事实上,它是三极的。
然后,我想将这些属性(温度)值插入到一堆不同的纬度/经度点(存储为 lat1(t)、lon1(t),大约 10,000 t...),这些点不落在实际的网格点上。我尝试过 matplotlib.mlab.griddata,但这需要太长时间(毕竟它并不是真正为我正在做的事情而设计的)。我也尝试过 scipy.interpolate.interp2d,但出现 MemoryError (我的网格约为 400x400)。
有没有什么巧妙的、最好是快速的方法来做到这一点?我忍不住认为答案是显而易见的......谢谢!
So, I have three numpy arrays which store latitude, longitude, and some property value on a grid -- that is, I have LAT(y,x), LON(y,x), and, say temperature T(y,x), for some limits of x and y. The grid isn't necessarily regular -- in fact, it's tripolar.
I then want to interpolate these property (temperature) values onto a bunch of different lat/lon points (stored as lat1(t), lon1(t), for about 10,000 t...) which do not fall on the actual grid points. I've tried matplotlib.mlab.griddata, but that takes far too long (it's not really designed for what I'm doing, after all). I've also tried scipy.interpolate.interp2d, but I get a MemoryError (my grids are about 400x400).
Is there any sort of slick, preferably fast way of doing this? I can't help but think the answer is something obvious... Thanks!!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
我是否正确地认为您的数据网格看起来像这样(红色是旧数据,蓝色是新的插值数据)?
替代文本 http:// www.geekops.co.uk/photos/0000-00-02%20%28Forum%20images%29/DataSeparation.png
这可能是一种有点暴力的方法,但是渲染现有数据怎么样?作为位图(opengl 将通过配置正确的选项为您进行简单的颜色插值,并且您可以将数据渲染为三角形,这应该相当快)。然后,您可以在新点的位置对像素进行采样。
或者,您可以对第一组点进行空间排序,然后找到新点周围最近的旧点,并根据到这些点的距离进行插值。
Am I right in thinking your data grids look something like this (red is the old data, blue is the new interpolated data)?
alt text http://www.geekops.co.uk/photos/0000-00-02%20%28Forum%20images%29/DataSeparation.png
This might be a slightly brute-force-ish approach, but what about rendering your existing data as a bitmap (opengl will do simple interpolation of colours for you with the right options configured and you could render the data as triangles which should be fairly fast). You could then sample pixels at the locations of the new points.
Alternatively, you could sort your first set of points spatially and then find the closest old points surrounding your new point and interpolate based on the distances to those points.
有一个名为 BIVAR 的 FORTRAN 库,它非常有用适合这个问题。通过一些修改,您可以使用 f2py 使其在 python 中可用。
从描述来看:
There is a FORTRAN library called BIVAR, which is very suitable for this problem. With a few modifications you can make it usable in python using f2py.
From the description:
尝试结合反距离加权和
scipy.spatial.KDTree
描述于SO
反距离-weighted-idw-interpolation-with-python。
Kd 树
在 2d 3d ... 中工作良好,反距离加权平滑且局部,
并且 k= 最近邻居的数量可以改变以权衡速度/准确性。
Try the combination of inverse-distance weighting and
scipy.spatial.KDTree
described in SO
inverse-distance-weighted-idw-interpolation-with-python.
Kd-trees
work nicely in 2d 3d ..., inverse-distance weighting is smooth and local,
and the k= number of nearest neighbours can be varied to tradeoff speed / accuracy.
Roger Veciana 有一个 很好的反距离示例我 Rovira 以及一些使用 GDAL 写入 geotiff 的代码(如果您对此感兴趣)。
这对于常规网格来说很粗糙,但假设您首先使用 pyproj 或其他东西将数据投影到像素网格,同时要小心数据使用的投影。
他的算法和示例脚本的副本:
There is a nice inverse distance example by Roger Veciana i Rovira along with some code using GDAL to write to geotiff if you're into that.
This is of coarse to a regular grid, but assuming you project the data first to a pixel grid with pyproj or something, all the while being careful what projection is used for your data.
A copy of his algorithm and example script:
这里有很多选项,哪一个最好取决于您的数据......
但是我不知道适合您的现成解决方案
您说您的输入数据来自三极数据。对于如何构建这些数据,存在三种主要情况。
其中最简单的是 2。不是在 LAT LON 空间中插值,而是“只是”将您的点转换回源空间并在那里插值。
适用于 1 和 2 的另一个选项是搜索从三极空间映射的单元以覆盖您的样本点。 (您可以使用 BSP 或网格类型结构来加速此搜索)选择一个单元格,然后在其中进行插值。
最后还有一堆非结构化插值选项..但它们往往很慢。
我个人最喜欢的是使用最近 N 个点的线性插值,找到这 N 个点可以再次通过网格或 BSP 来完成。另一个不错的选择是对非结构化点进行 Delauney 三角剖分,并在生成的三角网格上进行插值。
就我个人而言,如果我的网格是情况 1,我会使用非结构化策略,因为我担心必须处理具有重叠投影的单元格搜索。选择“正确”的细胞会很困难。
There's a bunch of options here, which one is best will depend on your data...
However I don't know of an out-of-the-box solution for you
You say your input data is from tripolar data. There are three main cases for how this data could be structured.
The easiest of these is 2. Instead of interpolating in LAT LON space, "just" transform your point back into the source space and interpolate there.
Another option that works for 1 and 2 is to search for the cells that maps from tripolar space to cover your sample point. (You can use a BSP or grid type structure to speed up this search) Pick one of the cells, and interpolate inside it.
Finally there's a heap of unstructured interpolation options .. but they tend to be slow.
A personal favourite of mine is to use a linear interpolation of the nearest N points, finding those N points can again be done with gridding or a BSP. Another good option is to Delauney triangulate the unstructured points and interpolate on the resulting triangular mesh.
Personally if my mesh was case 1, I'd use an unstructured strategy as I'd be worried about having to handle searching through cells with overlapping projections. Choosing the "right" cell would be difficult.
我建议您看一下 GRASS(开源 GIS 软件包)插值功能 (http://grass.ibiblio.org/gdp/html_grass62/v.surf.bspline.html)。它不是用 python 编写的,但您可以重新实现它或与 C 代码交互。
I suggest you taking a look at GRASS (an open source GIS package) interpolation features (http://grass.ibiblio.org/gdp/html_grass62/v.surf.bspline.html). It's not in python but you can reimplement it or interface with C code.