SciPy Interpolation
Interpolation is often required to estimate data points within the range of a discrete set of known data points. SciPy provides multiple interpolation classes and functions, such as interp1d for 1-dimensional interpolation and griddata for multidimensional data.
Key Topics
1D Interpolation
The interp1d function constructs a piecewise interpolation function from given data points. You can choose different types of interpolation (linear, cubic, etc.).
Example
import numpy as np
from scipy.interpolate import interp1d
import matplotlib.pyplot as plt
x = np.array([0, 1, 2, 3, 4])
y = np.array([0, 2, 4, 6, 8])
f_linear = interp1d(x, y, kind='linear')
f_cubic = interp1d(x, y, kind='cubic')
x_new = np.linspace(0, 4, 10)
plt.plot(x, y, 'o', label='data points')
plt.plot(x_new, f_linear(x_new), '-', label='linear')
plt.plot(x_new, f_cubic(x_new), '--', label='cubic')
plt.legend()
plt.show()
print("Linear Interpolation:", f_linear(x_new))
print("Cubic Interpolation:", f_cubic(x_new))
                Output
Cubic Interpolation: [0. 0.915... 1.728... ... 8.]
Explanation: The interp1d function returns callable functions that can be used to evaluate interpolated values at any point within the domain of x. The plot shows the original data points and the interpolated values using linear and cubic methods.
Multidimensional Interpolation
Use scipy.interpolate.griddata for 2D or ND interpolation. Provide arrays of points and values, and specify the interpolation method.
Example
import numpy as np
from scipy.interpolate import griddata
import matplotlib.pyplot as plt
# Define grid points
grid_x, grid_y = np.mgrid[0:1:100j, 0:1:100j]
# Define data points
points = np.random.rand(100, 2)
values = np.sin(points[:,0]**2 + points[:,1]**2)
# Interpolate using different methods
grid_z0 = griddata(points, values, (grid_x, grid_y), method='nearest')
grid_z1 = griddata(points, values, (grid_x, grid_y), method='linear')
grid_z2 = griddata(points, values, (grid_x, grid_y), method='cubic')
# Plot the results
plt.subplot(221)
plt.imshow(grid_z0.T, extent=(0,1,0,1), origin='lower')
plt.title('Nearest')
plt.subplot(222)
plt.imshow(grid_z1.T, extent=(0,1,0,1), origin='lower')
plt.title('Linear')
plt.subplot(223)
plt.imshow(grid_z2.T, extent=(0,1,0,1), origin='lower')
plt.title('Cubic')
plt.subplot(224)
plt.plot(points[:,0], points[:,1], 'k.', ms=1)
plt.title('Data Points')
plt.gcf().set_size_inches(8, 8)
plt.show()
                Output
Explanation: The griddata function interpolates the values at the grid points using different methods. The plots show the interpolated values using nearest, linear, and cubic methods, and the original data points.
Spline Methods
Functions like UnivariateSpline and splrep allow for smooth spline fitting, particularly useful in smoothing noisy datasets.
Example
import numpy as np
from scipy.interpolate import UnivariateSpline
import matplotlib.pyplot as plt
x = np.linspace(0, 10, 10)
y = np.sin(x) + np.random.normal(0, 0.1, x.size)
spl = UnivariateSpline(x, y)
x_new = np.linspace(0, 10, 100)
plt.plot(x, y, 'o', label='data points')
plt.plot(x_new, spl(x_new), label='spline')
plt.legend()
plt.show()
                Output
Explanation: The UnivariateSpline function fits a smooth spline to the noisy data points. The plot shows the original data points and the fitted spline curve.
Key Takeaways
- Flexible Methods: Linear, cubic, spline, and more for various use cases.
 - 1D vs. N-D: Choose 
interp1dfor 1D orgriddatafor higher dimensions. - Spline Fitting: Smooth curves for noisy data.
 - Ease of Use: Interpolated values can be easily computed at any point in the domain.