Interpolation 2D#

interp2d interpolates 2D gridded data. Input is a pair of 1D coordinate vectors and a 2D value matrix; the output is the interpolated surface on the query grid.

Bilinear interpolation#

import numpy as np
from pflm.interp import interp2d

x1 = np.linspace(-1, 1, 21)
x2 = np.linspace(-1, 1, 21)
X1, X2 = np.meshgrid(x1, x2, indexing="ij")
Z = np.sin(np.pi * X1) * np.cos(np.pi * X2)

x1q = np.linspace(-1, 1, 51)
x2q = np.linspace(-1, 1, 51)
Zq = interp2d(x1, x2, Z, x1q, x2q, method="linear")
print("Output shape:", Zq.shape)  # (51, 51)

Bicubic spline interpolation#

For smoother surfaces, switch to spline.

Zq_spline = interp2d(x1, x2, Z, x1q, x2q, method="spline")

# Ground truth on query grid
X1q, X2q = np.meshgrid(x1q, x2q, indexing="ij")
Z_true = np.sin(np.pi * X1q) * np.cos(np.pi * X2q)
print("Linear  max-err:", np.max(np.abs(Zq - Z_true)))
print("Spline  max-err:", np.max(np.abs(Zq_spline - Z_true)))