If I understand your question correctly, are your โobservationโ inputs regularly snapped to the grid?
If so, scipy.ndimage.map_coordinates does exactly what you want.
This is a little difficult to understand on the first pass, but, in fact, you just pass it the sequence of coordinates into which you want to interpolate the grid values โโin the coordinates pixel / voxel / n-dimension-index.
As a 2D example:
import numpy as np from scipy import ndimage import matplotlib.pyplot as plt

To do this in n dimensions, we just need to pass arrays of the appropriate size:
import numpy as np from scipy import ndimage data = np.arange(3*5*9).reshape((3,5,9)).astype(np.float) coords = np.array([[1.2, 3.5, 7.8], [0.5, 0.5, 6.8]]) zi = ndimage.map_coordinates(data, coords.T)
As for scaling and memory usage, map_coordinates will create a filtered copy of the array if you use order> 1 (i.e. not linear interpolation). If you just want to interpolate at a very small number of points, this is a pretty big cost. However, it does not increase with the number of points at which you want to interpolate. If you have enough RAM for one temporary copy of the input data array, everything will be fine.
If you cannot keep a copy of your data in memory, you can either: a) specify prefilter=False and order=1 and use linear interpolation, or b) replace the original data with the filtered version using ndimage.spline_filter , and then call map_coordinates with prefilter prefilter=False .
Even if you have enough RAM, saving a filtered dataset can be a big boost if you need to call map_coordinates several times (e.g. interactive use, etc.).