Re: [SciPy-User] 2-D data interpolation
![](https://secure.gravatar.com/avatar/7dd64dbe40f809b9f8276bde56c872fd.jpg?s=120&d=mm&r=g)
You can try also scipy.interpolate.griddata (not the pylab's griddata!) Nadav
![](https://secure.gravatar.com/avatar/d593991505d6717eaf98a23379bcdeb9.jpg?s=120&d=mm&r=g)
2012/5/31 Nadav Horesh <nadavh@visionsense.com>:
You can try also scipy.interpolate.griddata (not the pylab's griddata!)
Nadav
_______________________________________________ SciPy-User mailing list SciPy-User@scipy.org http://mail.scipy.org/mailman/listinfo/scipy-user
I tried this function and it works very similar to the interp2 function of matlab. The only problem is that my data are very peaky and the cubic version of griddata gives me big over/under-shoots. The matlab function does not gives me such behavior. Is there another high 2D order interpolator that could be used in this case ? Octave has a nice "pchip" option for interp2 that use piecewise cubic Hermite interpolating polynomial, but unfortunatly griddata does not have such option. Thanks Christine
![](https://secure.gravatar.com/avatar/da3a0a1942fbdc5ee9a9b8115ac5dae7.jpg?s=120&d=mm&r=g)
06.06.2012 21:13, Darcoux Christine kirjoitti: [clip]
I tried this function and it works very similar to the interp2 function of matlab. The only problem is that my data are very peaky and the cubic version of griddata gives me big over/under-shoots. The matlab function does not gives me such behavior.
Is there another high 2D order interpolator that could be used in this case ?
Octave has a nice "pchip" option for interp2 that use piecewise cubic Hermite interpolating polynomial, but unfortunatly griddata does not have such option.
Ah, your data is actually on a regular grid rather than scattered. This means n-dim interpolation can be built up from 1-D interpolation as a tensor product. Scipy does have `pchip` for 1-D, but currently it's a bit clumsy to use for 2-D data. You can build up tensor product 2-D pchip interpolation like this: ---- import numpy as np from scipy.interpolate import pchip def pchip2(x, y, z, xi, yi): """P-chip interpolation on 2-D. x, y, xi, yi should be 1-D and z.shape == (len(x), len(y))""" z2 = np.empty([len(xi), len(y)], dtype=z.dtype) for k in xrange(len(y)): z2[:,k] = pchip(x, z[:,k])(xi) z3 = np.empty([len(xi), len(yi)], dtype=z.dtype) for k in xrange(len(xi)): z3[k,:] = pchip(y, z2[k,:])(yi) return z3 # Random test case import matplotlib.pyplot as plt x = 2*pi*np.random.rand(20) x.sort() y = 2*pi*np.random.rand(10) y.sort() z = np.cos(x[:,None]) * np.sin(y) plt.figure(1) plt.pcolor(x, y, z.T) xi = np.linspace(x.min(), x.max(), 200) yi = np.linspace(y.min(), y.max(), 300) zi = pchip2(x, y, z, xi, yi) plt.figure(2) plt.pcolor(xi, yi, zi.T) ---- It's not the fastest thing in the world, but maybe helps? The same idea generalizes to 3 and any higher dimensions. The pchip idea does not directly generalize to true *scattered* data interpolation, which is what `griddata` does. There, the problem is quite a bit more tricky, but likely there is a publication out there that discusses how to do monotonicity-preserving interpolation on an arbitrary network of triangles... -- Pauli Virtanen
participants (3)
-
Darcoux Christine
-
Nadav Horesh
-
Pauli Virtanen