python 中具有不同维度的数组的二维插值

2 d interpolation with the arrays with different dimensions in python

我有三个二维数组,其形状为 (100,100)。 每个数组看起来像:

x =
[[-104.09417725 -104.08866882 -104.0831604  ..., -103.8795166  -103.87399292
-103.86849976]
..., 
[-104.11058044 -104.10507202 -104.09954834 ..., -103.89535522
-103.88983154 -103.88430786]
[-104.11141968 -104.10591125 -104.10038757 ..., -103.89614868 -103.890625
-103.88513184]]
y = 
[[ 40.81712341  40.81744385  40.81776428 ...,  40.82929611  40.82960129
40.82990646]
 ..., 
[ 40.98789597  40.9882164   40.98854065 ...,  41.00011063  41.00041199
41.00072479]]
z =
[[ 1605.58544922  1615.62341309  1624.33911133 ...,  1479.11254883
1478.328125    1476.13378906]
 ..., 
[ 1596.03857422  1600.5690918   1606.30712891 ...,  1598.56982422
1594.90454102  1594.07763672]]

我还有两个一维数组 x1 和 y1。这些x1和y1分别在x和y的范围内如:

x1 = [ 104.07794  104.03169  104.03352  104.03584  104.03835  104.04085
104.04334  104.07315  104.07133  104.07635  104.07916  104.0321
104.03481  104.03741  104.04002  104.04366  104.04572  104.04787
...................................................................   
103.92937  103.89825  103.90027  103.90253  103.90352  103.90375
103.89922  103.89931  103.90145  103.90482  103.90885  103.91058
103.91243  103.91525  103.91785  103.92078  103.97814]
y1 = [ 40.9542   40.96922  40.96733  40.96557  40.96377  40.96218  40.96043
40.95446  40.95686  40.95296  40.95184  40.94984  40.94834  40.9469
40.94538  40.94287  40.94154  40.94008  40.93824  40.93705  40.93579
.........................................................................  
40.89675  40.9015   40.90044  40.89948  40.89766  40.89513  40.88374
40.88118  40.87915  40.87933  40.87917  40.878    40.87675  40.87598
40.87515  40.87421  40.91258]

x1 和 y1 对应为 (x1,y1),下标为 (104.07794,40.9542),(104.03169,40.96922) 等。 这里我想得到的是对应于由 x,y,z 插值的 (x1,y1) 的 z1。 为此,我编写了如下代码:

x1,y1 = np.meshgrid(x1,y1)
f = interpolate.interp2d(x,y,z,kind='linear')
or
f = interpolate.Rbf(x,y,z,function='linear')
z1 = f(x1,y1)

但是,我不想将 x1、y1 转换为二维网格,因为此函数会填充我不想填充的网格点。因此,我想在不进行转换的情况下对 x1、y1 进行插值到二维网格,但这些二维插值方法似乎要求 x、y 和 x1、y1 具有相同的维度。有没有办法在不使 x1,y1 和 x,y 的维度相同的情况下进行插值? 谢谢, 艾萨克

我不太清楚你说的x,y and x1,y1 have same dimesion是什么意思。

我可以构建一组输入数据:

In [294]: x,y=np.meshgrid(np.arange(10),np.arange(8))    
In [295]: z=x+y

In [296]: f=interpolate.Rbf(x,y,z,kind='linear')

In [297]: x.shape
Out[297]: (8, 10)

我使用 meshgrid 只是因为它是生成一对二维阵列的最简单方法,可以构成一个可共振的表面。因为它 interp2d 不喜欢使用这个表面。

我可以将另一组点定义为 2 个一维数组。点数与定义表面的点数或点布局无关。我只需要给出对应于定义表面的 (x,y,z) 三元组的 (x1,y1) 对。

In [298]: x1=np.linspace(0,10,15)
In [299]: y1=np.linspace(0,10,15)    
In [300]: f(x1,y1)
Out[300]: 
array([  1.78745907e-13,   1.42752327e+00,   2.85761392e+00,
         4.28560518e+00,   5.71422460e+00,   7.14293770e+00,
         8.57139192e+00,   1.00000000e+01,   1.14285329e+01,
         1.28573610e+01,   1.42852315e+01,   1.57040689e+01,
         1.70924026e+01,   1.84049594e+01,   1.95946258e+01])

x 是 2d 的事实无关紧要;我可以压平输入。 interp2d 的文档特别提到对多维输入执行此操作。

 f1=interpolate.Rbf(x.flatten(), y.flatten(), z.flatten(), kind='linear')

插值点也可以二维排列

f(x1.reshape((3,5)), y1.reshape((3,5)))

相同的插值,只是排列在 (3,5) 数组中。


interp2d 操作有点不同。 'cubic' 似乎比 'linear' 更快乐(我还没有深入研究为什么):

In [326]: f2=interpolate.interp2d(x,y,z,kind='cubic')    
In [327]: z1=f2(x1,y1)

In [328]: z1.shape
Out[328]: (15, 15)

结果是 (x1.shape, y1.shape) - 它将 x1,y1 视为定义一个 meshgrid 类表面。

但我可以提取对角线,并得到与 Rbf 基本相同的值(两端除外):

In [329]: z1.diagonal()
Out[329]: 
array([  7.61803576e-18,   1.42857137e+00,   2.85714294e+00,
         4.28571419e+00,   5.71428543e+00,   7.14285905e+00,
         8.57142306e+00,   1.00000000e+01,   1.14287955e+01,
         1.28551995e+01,   1.41778962e+01,   1.54127554e+01,
         8.99313361e+00,   1.60000000e+01,   1.60000000e+01])

因此,使用 Rbf 可以准确指定要在何处插入值,而 interp2d 则可以指定 2d space 的 x,y 坐标。