[SciPy-User] 2D bilinear interpolation from low to high resolution

Marston Sheldon Johnston marston@chalmers...
Tue Jul 10 19:04:13 CDT 2012

```Hi,

I've been trying to copy and modify a Scipy Cookbook function that does a 2d spline interpolation using the same data limits but with higher resolution. In my function I use a bilinear interpolation.
I've struggled to get this working and now that I have the results are horrible and incorrect. Would love some help with this if anyone has some experience with this particular subject.
I assume the lat and lon must be ascending, since it is not in the original data, I have moved the data around. I've tried this without sorting the lats and the results are the similar: garbled! The data is a slice of an array. The slice is centered at lat0 lon0 and is ±10 degrees on all 4 sides forming a 20x20 degree window. The initial resolution is 1.125 and the new resolution is 0.703125.

The input dictionary and data is posted below.

def Low2HighRes(plist,ivals):
"""N-D interpolation for equally-spaced data"""
latsort = np.argsort(plist['xlats'])
lonsort = np.argsort(plist['xlons'])
ix,jy = np.meshgrid(plist['newx'],plist['newy'])
coords = scipy.array([ix,jy])
vals = ivals[latsort,:]
nvals = scipy.ndimage.map_coordinates(vals,coords,order=1,mode='nearest')
return nvals

The new resolution is 0.703125:
'newx': array([-9.84375 , -9.140625, -8.4375  , -7.734375, -7.03125 , -6.328125,
-5.625   , -4.921875, -4.21875 , -3.515625, -2.8125  , -2.109375,
-1.40625 , -0.703125, -0.      ,  0.703125,  1.40625 ,  2.109375,
2.8125  ,  3.515625,  4.21875 ,  4.921875,  5.625   ,  6.328125,
7.03125 ,  7.734375,  8.4375  ,  9.140625,  9.84375 ])

'newy': array([-9.84375 , -9.140625, -8.4375  , -7.734375, -7.03125 , -6.328125,
-5.625   , -4.921875, -4.21875 , -3.515625, -2.8125  , -2.109375,
-1.40625 , -0.703125, -0.      ,  0.703125,  1.40625 ,  2.109375,
2.8125  ,  3.515625,  4.21875 ,  4.921875,  5.625   ,  6.328125,
7.03125 ,  7.734375,  8.4375  ,  9.140625,  9.84375 ])

original coordinates of the data to be interpolated are lats and lons with a 1.125 resolution:
'modx': array([-10.125,  -9.   ,  -7.875,  -6.75 ,  -5.625,  -4.5  ,  -3.375,
-2.25 ,  -1.125,  -0.   ,   1.125,   2.25 ,   3.375,   4.5  ,
5.625,   6.75 ,   7.875,   9.   ,  10.125])
'mody': array([-10.125,  -9.   ,  -7.875,  -6.75 ,  -5.625,  -4.5  ,  -3.375,
-2.25 ,  -1.125,  -0.   ,   1.125,   2.25 ,   3.375,   4.5  ,
5.625,   6.75 ,   7.875,   9.   ,  10.125])

'lats': array([ 18.50457985,  17.38309053,  16.26160115,  15.14011169,
14.01862218,  12.8971326 ,  11.77564298,  10.65415331,
9.53266359,   8.41117384,   7.28968406,   6.16819425,
5.04670442,   3.92521457,   2.8037247 ,   1.68223483,
0.56074494,  -0.56074494,  -1.68223483]),
'lons': array([ 229.5  ,  230.625,  231.75 ,  232.875,  234.   ,  235.125,
236.25 ,  237.375,  238.5  ,  239.625,  240.75 ,  241.875,
243.   ,  244.125,  245.25 ,  246.375,  247.5  ,  248.625,  249.75 ]),

The data:

array([[  2.91407923e-03,   3.39587848e-03,   1.21381157e-03,
3.29374452e-04,   7.41946205e-05,   0.00000000e+00,
0.00000000e+00,   0.00000000e+00,   4.87387297e-05,
0.00000000e+00,   0.00000000e+00,   0.00000000e+00,
3.60107806e-05,   1.17035036e-03,   0.00000000e+00,
0.00000000e+00,   0.00000000e+00,   0.00000000e+00,
0.00000000e+00],
[  2.40930752e-03,   4.95893275e-03,   2.63592694e-03,
1.06014498e-03,   0.00000000e+00,   0.00000000e+00,
0.00000000e+00,   1.30197592e-03,   1.14706755e-02,
1.85952216e-04,   0.00000000e+00,   0.00000000e+00,
0.00000000e+00,   0.00000000e+00,   0.00000000e+00,
0.00000000e+00,   0.00000000e+00,   0.00000000e+00,
0.00000000e+00],
[  1.04772742e-03,   2.78711016e-03,   3.14659718e-03,
0.00000000e+00,   0.00000000e+00,   0.00000000e+00,
0.00000000e+00,   0.00000000e+00,   0.00000000e+00,
0.00000000e+00,   0.00000000e+00,   0.00000000e+00,
0.00000000e+00,   6.02249238e-05,   4.03569084e-06,
0.00000000e+00,   0.00000000e+00,   0.00000000e+00,
0.00000000e+00],
[  0.00000000e+00,   0.00000000e+00,   0.00000000e+00,
0.00000000e+00,   0.00000000e+00,   0.00000000e+00,
0.00000000e+00,   0.00000000e+00,   0.00000000e+00,
0.00000000e+00,   0.00000000e+00,   1.24175097e-06,
0.00000000e+00,   0.00000000e+00,   2.44314520e-04,
2.39037072e-05,   3.38377140e-05,   3.95187264e-04,
0.00000000e+00],
[  0.00000000e+00,   0.00000000e+00,   0.00000000e+00,
0.00000000e+00,   0.00000000e+00,   0.00000000e+00,
2.48350193e-06,   7.45050602e-06,   1.17966347e-05,
0.00000000e+00,   1.55218879e-06,   1.86262650e-06,
2.60457280e-04,   0.00000000e+00,   4.62552271e-05,
9.49318637e-04,   9.99299111e-04,   4.70123850e-02,
8.09109434e-02],
[  0.00000000e+00,   0.00000000e+00,   0.00000000e+00,
0.00000000e+00,   0.00000000e+00,   1.17966347e-05,
7.91616258e-05,   1.24175097e-06,   0.00000000e+00,
6.20875483e-07,   4.59447874e-05,   5.22777205e-04,
0.00000000e+00,   4.52431990e-03,   1.75440796e-02,
8.04008991e-02,   1.31909043e-01,   2.24047899e-01,
1.60426781e-01],
[  0.00000000e+00,   0.00000000e+00,   0.00000000e+00,
9.31313252e-07,   1.14861969e-05,   2.39968387e-04,
4.34612866e-06,   2.17306433e-06,   1.44353558e-04,
1.58664735e-03,   2.86217406e-02,   1.11849174e-01,
9.77677181e-02,   1.43859955e-02,   7.32049495e-02,
6.55011237e-02,   3.44568849e-01,   4.58411306e-01,
2.49592885e-01],
[  0.00000000e+00,   1.61427633e-05,   4.99183894e-04,
3.17937918e-02,   4.85810265e-02,   1.03917181e-01,
1.25399157e-01,   1.80325225e-01,   2.97502756e-01,
5.07521629e-01,   7.01690793e-01,   7.83944130e-01,
3.59588116e-01,   4.82781321e-01,   2.19913769e+00,
1.45968425e+00,   7.70302236e-01,   6.41377449e-01,
1.36474028e-01],
[  1.13744393e-03,   6.07185205e-03,   2.85994828e-01,
1.50236040e-01,   7.42231190e-01,   1.22813118e+00,
6.46776557e-01,   5.81912160e-01,   1.87843180e+00,
1.92207563e+00,   1.52547717e+00,   1.32381713e+00,
3.73675466e-01,   7.55523860e-01,   2.65545297e+00,
1.27209759e+00,   1.13974738e+00,   1.16467550e-01,
2.09415719e-01],
[  1.38720661e-01,   3.32264960e-01,   4.35250461e-01,
7.92550027e-01,   1.22075701e+00,   8.08324039e-01,
3.90933961e-01,   3.94844234e-01,   4.14039224e-01,
1.87421179e+00,   1.89138579e+00,   1.72843981e+00,
5.95286727e-01,   1.14342570e+00,   1.61977232e+00,
4.52039897e-01,   2.81218112e-01,   1.66340306e-01,
9.93605703e-02],
[  9.74169195e-01,   9.17763233e-01,   5.85691392e-01,
4.46551383e-01,   2.51251876e-01,   1.49007021e-02,
2.15577297e-02,   1.01625830e-01,   9.69323218e-02,
2.31756687e-01,   8.57786715e-01,   1.20130097e-02,
4.75826561e-02,   1.08127639e-01,   9.12918925e-01,
1.77337572e-01,   2.07490385e-01,   8.76067802e-02,
7.50075638e-01],
[  7.03467131e-01,   5.82458824e-02,   9.40253865e-03,
5.74371964e-03,   2.25005276e-03,   5.12843195e-04,
3.22482735e-03,   6.15287630e-04,   0.00000000e+00,
0.00000000e+00,   3.08016338e-03,   7.09070871e-03,
1.34970576e-01,   2.69089937e-01,   5.28816462e-01,
7.75388122e-01,   9.10060704e-02,   3.86802018e-01,
5.62999070e-01],
[  1.45083088e-02,   1.42366753e-03,   2.19852012e-03,
8.08690325e-04,   2.21124804e-03,   1.78905274e-03,
1.85610738e-03,   2.66821240e-03,   1.23740488e-03,
7.45671510e-04,   1.78346480e-03,   6.83180336e-03,
2.30602473e-02,   6.35242537e-02,   5.68188019e-02,
7.31670763e-03,   6.97802007e-03,   1.26199163e-02,
2.35131755e-02],
[  6.02249238e-05,   2.92432378e-04,   1.13030383e-03,
5.85175178e-04,   1.46557658e-03,   1.88808236e-03,
3.10065225e-03,   3.55264964e-03,   4.15862398e-03,
7.17980415e-03,   4.59075347e-03,   2.15481054e-02,
4.47589159e-03,   6.03925623e-03,   9.55558382e-03,
1.08743245e-02,   4.59385756e-03,   6.76350715e-03,
1.05188731e-02],
[  1.71982509e-04,   7.66781232e-05,   2.50212825e-03,
4.58050938e-03,   3.75257153e-03,   3.77368135e-03,
3.04756756e-03,   4.28559305e-03,   1.21471193e-02,
1.85669716e-02,   2.26231515e-02,   2.37028543e-02,
7.72741623e-03,   1.21803358e-02,   7.17204344e-03,
1.18307828e-03,   9.51678026e-03,   8.88597034e-03,
1.38688069e-02],
[  7.85935298e-03,   1.02338903e-02,   2.00772509e-02,
1.29666738e-02,   8.32718238e-03,   7.63056008e-03,
6.14076946e-03,   9.90855228e-03,   1.00889169e-02,
1.48749352e-02,   1.88460555e-02,   8.26913025e-03,
9.51088127e-03,   7.60696689e-03,   1.25758338e-03,
4.51376487e-04,   1.18463056e-03,   2.09514447e-03,
2.51206243e-03],
[  2.33238097e-02,   2.73073465e-02,   3.22693810e-02,
1.88162532e-02,   5.83653990e-03,   3.47224623e-03,
1.80892076e-03,   9.19796061e-03,   8.73230398e-03,
1.45570468e-02,   1.55864581e-02,   1.42422626e-02,
1.35748219e-02,   1.19139794e-02,   3.64764361e-03,
5.92625700e-04,   2.55024619e-03,   1.44043122e-03,
1.51959271e-03],
[  4.65045050e-02,   4.04065773e-02,   2.90905014e-02,
1.47327557e-02,   6.68620877e-03,   5.12005016e-03,
4.09746822e-03,   5.41186146e-03,   1.08640799e-02,
1.43946875e-02,   1.87681355e-02,   2.52960213e-02,
1.79439243e-02,   1.72994547e-02,   7.33191893e-03,
4.66867350e-03,   1.00023043e-03,   9.08961752e-04,
2.14481447e-03],
[  7.23621100e-02,   4.10851948e-02,   8.70250165e-03,
5.37367724e-03,   2.11873767e-03,   3.15994583e-03,
2.98547978e-03,   5.60216000e-03,   5.73099125e-03,
9.40564275e-03,   1.04456097e-02,   1.35018695e-02,
2.56229118e-02,   2.75842566e-02,   2.80958600e-02,
3.02949995e-02,   4.40449081e-03,   1.03189505e-03,
1.60216924e-03]], dtype=float32)

Appreciate any help with getting this function to work.
/M
```