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

Vor*_*ity 5 python numpy matplotlib scipy map-projections

我试图将具有相关纬度和经度的不规则网格化数据集(原始卫星数据)映射到由给定的经常网格化的纬度和经度集basemap.makegrid().我使用matplotlib.mlab.griddatampl_toolkits.natgrid安装.下面是whosipython中用作输出的变量列表以及变量的一些统计信息:

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
Run Code Online (Sandbox Code Playgroud)

datalat并且datalon是原始数据坐标

gridlat并且gridlon是插入的坐标

var 包含实际数据

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

Tim*_*omb 2

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

您可以尝试使用SciPyinterpolate.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')
Run Code Online (Sandbox Code Playgroud)

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