Python matplotlib.mlab.griddata非常慢,在输入有效数据时返回nan数组

Python matplotlib.mlab.griddata非常慢,在输入有效数据时返回nan数组,python,numpy,matplotlib,scipy,map-projections,Python,Numpy,Matplotlib,Scipy,Map Projections,我正在尝试将带有相关纬度和经度的不规则网格数据集(原始卫星数据)映射到由basemap.makegrid()给定的一组规则网格纬度和经度。我正在使用matplotlib.mlab.griddata并安装了mpl\u工具包.natgrid。以下是ipython中的whos输出的变量列表,以及变量的一些统计信息: Variable Type Data/Info ------------------------------- datalat ndarray 666x1081

我正在尝试将带有相关纬度和经度的不规则网格数据集(原始卫星数据)映射到由
basemap.makegrid()
给定的一组规则网格纬度和经度。我正在使用
matplotlib.mlab.griddata
并安装了
mpl\u工具包.natgrid
。以下是ipython中的
whos
输出的变量列表,以及变量的一些统计信息:

Variable   Type       Data/Info
-------------------------------
datalat    ndarray    666x1081: 719946 elems, type `float32`, 2879784 bytes (2 Mb)
datalon    ndarray    666x1081: 719946 elems, type `float32`, 2879784 bytes (2 Mb)
gridlat    ndarray    1200x1000: 1200000 elems, type `float64`, 9600000 bytes (9 Mb)
gridlon    ndarray    1200x1000: 1200000 elems, type `float64`, 9600000 bytes (9 Mb)
var        ndarray    666x1081: 719946 elems, type `float32`, 2879784 bytes (2 Mb)

In [11]: var.min()
Out[11]: -30.0

In [12]: var.max()
Out[12]: 30.0

In [13]: datalat.min()
Out[13]: 27.339874

In [14]: datalat.max()
Out[14]: 47.05302

In [15]: datalon.min()
Out[15]: -137.55658

In [16]: datalon.max()
Out[16]: -108.41629

In [17]: gridlat.min()
Out[17]: 30.394031556984299

In [18]: gridlat.max()
Out[18]: 44.237140350357713

In [19]: gridlon.min()
Out[19]: -136.17646180595321

In [20]: gridlon.max()
Out[20]: -113.82353819404671
datalat
datalon
是原始数据坐标

gridlat
gridlon
是要插值的坐标

var
包含实际数据


使用这些变量,当我调用
griddata(datalon,datalat,var,gridlon,gridlat)
时,它花费了长达20分钟的时间来完成并返回一个
nan
数组。从数据来看,纬度和经度似乎是正确的,原始坐标与新区的一部分重叠,一些数据点位于新区之外。有人有什么建议吗?nan值表明我在做一些愚蠢的事情…

更有可能的是,griddata太难了。它设计用于处理随机采样的数据。您的数据几乎肯定是定期采样的——只是与目标输出网格不在同一网格上

如果地球的拓扑或曲率影响yoru的结果,请看一个更简单的方法,如仿射变换或一系列小芯片上的仿射变换

有一些现成的解决方案可能会有所帮助。这是一个很好的例子

此外,GIS中经常讨论此类问题。见:


如果您的数据位于网格上,使得点
(datalon[i],datalat[j])
处的数据点位于
数据[i,j]
中,那么您可以使用
scipy.interpolate.RectBivariateSpline
而不是
网格数据
。但是,某些特定于地理位置的库可能提供更多功能。

看起来像是
mlab.griddata
例程可能会对输出数据引入额外的约束,这些约束可能是不必要的。虽然输入位置可以是任何东西,但输出位置-因为您的示例位于lat/lon空间中,所以您选择的地图投影可能会违反这一点(即x/y中的规则栅格不是lat/lon中的规则栅格)

您可以尝试中的
interpolate.griddata
例程作为替代方法-但是,您需要将位置变量组合到单个数组中,因为调用签名不同:类似

import scipy.interpolate
data_locations = np.vstack(datalon.ravel(), datalat.ravel()).T
grid_locations = np.vstack(gridlon.ravel(), gridlat.ravel()).T
grid_data      = scipy.interpolate.griddata(data_locations, val.ravel(),
                                            grid_locations, method='nearest')

用于最近邻插值。这会将位置放入一个数组中,该数组有2列对应于您的2个维度。您可能还希望在地图投影的变换空间中执行插值。

如果使用pclormesh,则无需执行任何类型的插值。pcolormesh很乐意接受您在此处给出的数据结构:

from mpl_toolkits.basemap import Basemap
m = Basemap(-----)
x,y = m(datalon, datalat)
m.pcolormesh(x,y,var)
plt.show()
请使用这个,告诉我这是否有效

然而,当轨道数据重叠时,pcolormesh中存在一些问题。请参考我的这个问题,你可能会发现一些有用的东西


什么卫星?它是扫描仪还是凝视FPA?地面采样距离是多少?嘿,有趣的是。我需要能够为大约40多个不同的大气传感器做到这一点。大多数都是扫描传感器(圆锥形、交叉轨道等)。嘿,谢谢你的回答。不过我有几个问题。我一直在调查GDAL并与一些GIS人员交谈,但还没有找到一些问题的答案。1) 如果我想覆盖海岸线/网格线等,GDAL是否能够促进这一点,或者我是否需要预生成海岸线和网格线图像?2) 在python中使用GDAL有多困难?教程相对有限,python的API明显不足。3) 在这方面,有什么好的资源可以用来学习python中的GDAL吗?再次感谢你的帮助和时间。再次感谢你的回答。看起来我将使用GDAL作为我当前的解决方案。太好了,谢谢Tim!这实际上似乎是可行的,让我摆脱了一些非常恼人的第三方软件。