# Two-dimensional interpolation with scipy.interpolate.RectBivariateSpline

In the following code, the function $$z(x,y) = e^{-4x^2}e^{-y^2/4}$$ is calculated on a regular, coarse grid and then interpolated onto a finer one.

import numpy as np
from scipy.interpolate import RectBivariateSpline
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# Regularly-spaced, coarse grid
dx, dy = 0.4, 0.4
xmax, ymax = 2, 4
x = np.arange(-xmax, xmax, dx)
y = np.arange(-ymax, ymax, dy)
X, Y = np.meshgrid(x, y)
Z = np.exp(-(2*X)**2 - (Y/2)**2)

interp_spline = RectBivariateSpline(y, x, Z)

# Regularly-spaced, fine grid
dx2, dy2 = 0.16, 0.16
x2 = np.arange(-xmax, xmax, dx2)
y2 = np.arange(-ymax, ymax, dy2)
X2, Y2 = np.meshgrid(x2,y2)
Z2 = interp_spline(y2, x2)

fig, ax = plt.subplots(nrows=1, ncols=2, subplot_kw={'projection': '3d'})
ax[0].plot_wireframe(X, Y, Z, color='k')

ax[1].plot_wireframe(X2, Y2, Z2, color='k')
for axes in ax:
axes.set_zlim(-0.2,1)
axes.set_axis_off()

fig.tight_layout()
plt.show()


Note that for our function, Z, defined using the meshgrid set up here, the RectBivariateSpline method expects the corresponding one-dimensional arrays y and x to be passed in this order (opposite to that of interp2d.) This issue is related to the way that meshgrid is indexed which is based on the conventions of MATLAB.