在PYTHON

时间:2015-12-03 12:00:15

标签: python arrays interpolation

我已经花了两天时间寻找答案,但我一直有同样的错误,我无法理解为什么。无论我做什么,我都会收到错误“ValueError:1维数据的未知插值方法数组”

我正在尝试使用griddata

将值插值为更精细的网格

这是我的代码

import numpy as np

lon_ww3=array([[-10. , -10. , -10. , -10. , -10. , -10. , -10. , -10. , -10. ],
               [ -9.5,  -9.5,  -9.5,  -9.5,  -9.5,  -9.5,  -9.5,  -9.5,  -9.5],
               [ -9. ,  -9. ,  -9. ,  -9. ,  -9. ,  -9. ,  -9. ,  -9. ,  -9. ],
               [ -8.5,  -8.5,  -8.5,  -8.5,  -8.5,  -8.5,  -8.5,  -8.5,  -8.5]])

lat_ww3=array([[ 38. ,  38.5,  39. ,  39.5,  40. ,  40.5,  41. ,  41.5,  42. ],
               [ 38. ,  38.5,  39. ,  39.5,  40. ,  40.5,  41. ,  41.5,  42. ],
               [ 38. ,  38.5,  39. ,  39.5,  40. ,  40.5,  41. ,  41.5,  42. ],
               [ 38. ,  38.5,  39. ,  39.5,  40. ,  40.5,  41. ,  41.5,  42. ]])

Z=np.random.random_sample((4,9))*3

#Create finer mesh grid

lon_pn=[-10,-9]
lat_pn=[38,42]

lon_points=np.arange(lon_pn[0],lon_pn[1]+(300./3600),300./3600)[:-1]
lat_points=np.arange(lat_pn[0],lat_pn[1]+(300./3600),300./3600)[:-1]

LON_grid,LAT_grid=np.meshgrid(lon_points,lat_points)

from scipy.interpolate import griddata

Z_interp=griddata(lon_ww3.ravel(),lat_ww3.ravel(), Z.ravel(),LON_grid,LAT_grid)

我也试过这个,显然没有成功:

Z_interp=griddata(lon_ww3.ravel(),lat_ww3.ravel(), Z.ravel(),lon_points,lat_points)

几乎可以想到的每一种可能的变化......每次我都得到同样的错误:

“ValueError:”第n个“维数据”的未知插值方法数组[LON_grid]“

任何人都可以尝试重现代码并帮助我找出正在发生的事情吗?

提前致谢

2 个答案:

答案 0 :(得分:1)

您对griddata的使用是错误的。

将这些行添加到代码示例中。

xi = np.c_[lon_ww3.ravel(),lat_ww3.ravel()]
xx = np.c_[LON_grid.ravel(),LAT_grid.ravel()]

Z_interp=griddata(xi,Z.ravel(),xx)

xi是原始网格点的n,D向量。 xx是插值点的N,D向量。

np.c_是坐标每个方向的列堆栈。

答案 1 :(得分:0)

事实上,documentation for griddata中有一个很好的例子 第一个参数必须是一列坐标(每个轴不是两个单独的值),第二个是值列,第三个是新网格(不是两个separete值)。您提供了5个参数,这些参数定义为错误的来源。

网格创建也存在一些问题。这是有效的代码:

import numpy as np
from scipy.interpolate import griddata

lon_ww3 = np.array([[-10. , -10. , -10. , -10. , -10. , -10. , -10. , -10. , -10. ],
               [ -9.5,  -9.5,  -9.5,  -9.5,  -9.5,  -9.5,  -9.5,  -9.5,  -9.5],
               [ -9. ,  -9. ,  -9. ,  -9. ,  -9. ,  -9. ,  -9. ,  -9. ,  -9. ],
               [ -8.5,  -8.5,  -8.5,  -8.5,  -8.5,  -8.5,  -8.5,  -8.5,  -8.5]])

lat_ww3 = np.array([[ 38. ,  38.5,  39. ,  39.5,  40. ,  40.5,  41. ,  41.5,  42. ],
               [ 38. ,  38.5,  39. ,  39.5,  40. ,  40.5,  41. ,  41.5,  42. ],
               [ 38. ,  38.5,  39. ,  39.5,  40. ,  40.5,  41. ,  41.5,  42. ],
               [ 38. ,  38.5,  39. ,  39.5,  40. ,  40.5,  41. ,  41.5,  42. ]])

# in fact you'd better initialise them like this
#lon_ww3, lat_ww3 = np.mgrid[-10:-9:3j,38:42:9j]

# make the column of [lon,lat] values
lon_lat = np.c_[lon_ww3.ravel(), lat_ww3.ravel()]

Z = np.random.random_sample((lon_ww3.shape))*3

# make the propper grid
LON_grid, LAT_grid = np.mgrid[-10:-9:12j,38:42:48j]

Z_interp = griddata(lon_lat, Z.ravel(), (LON_grid, LAT_grid))

# you can see what you've done like this
import matplotlib.pyplot as plt
plt.imshow(Z_interp.T, extent = (-10, -8.5, 38, 42))
plt.show()