Progress on interpolation
parent
695934c55e
commit
57865ddc97
|
@ -0,0 +1,59 @@
|
|||
#!/usr/bin/env python
|
||||
"""
|
||||
Title: interp3d.py - interpolate to a set of points in 3-dimensional space
|
||||
Author: Craig Arthur, craig.arthur@ga.gov.au
|
||||
CreationDate: 2012-08-22
|
||||
Description: Use scipy.ndimage.interpolation.map-coordinates to interpolate
|
||||
data in three dimensions.
|
||||
|
||||
Version: $Rev$
|
||||
Id: $Id$
|
||||
"""
|
||||
|
||||
import numpy
|
||||
import pdb
|
||||
from scipy.ndimage.interpolation import map_coordinates
|
||||
|
||||
def interp3d(input_array, coords,
|
||||
scale=[360., 180., 365.],
|
||||
offset=[0.,-90.,0.]):
|
||||
"""
|
||||
Wrapper to scipy.ndimage.interpolation.map_coordinates, which
|
||||
converts coordinates of points to indices that correspond to the
|
||||
array. We assume that one is working with lon, lat, day data
|
||||
(i.e. initially designed to work with daily long term mean sea
|
||||
level pressure)
|
||||
|
||||
Input:
|
||||
input_array - a 3-d array of data at regular intervals, representing the
|
||||
data to be evaluated
|
||||
coords - a 3xn array of coordinates at which the data in input_array
|
||||
will be interpolated
|
||||
scale - a scale factor that reduces the coords values to the range of
|
||||
indices in input_array
|
||||
offset - an offset factor that is subtracted from the coords values
|
||||
before adjusting the scale (above)
|
||||
|
||||
Output:
|
||||
1-d array of values corresponding to the interpolated values
|
||||
at the points given in 'coords'
|
||||
|
||||
Example: vals = interp3d( data, coords,
|
||||
scale=[360., 180., 365.],
|
||||
offset=[0.,-90.,0.] )
|
||||
|
||||
"""
|
||||
|
||||
if input_array.ndim != 3:
|
||||
raise ValueError('Input array has incorrect shape')
|
||||
if coords.shape[0] != 3:
|
||||
raise ValueError('Coordinates of points must be 3-d')
|
||||
|
||||
dims = input_array.shape
|
||||
indices = [d*(c - o) / s for d,c,o,s in
|
||||
zip(dims,coords,offset,scale)]
|
||||
|
||||
values = map_coordinates(input_array,indices, mode='wrap')
|
||||
|
||||
return values
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
#From http://docs.scipy.org/doc/scipy/reference/tutorial/interpolate.html
|
||||
|
||||
import numpy as np
|
||||
from scipy import interpolate
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
# Define function over sparse 20x20 grid
|
||||
|
||||
x,y = np.mgrid[-1:1:20j,-1:1:20j]
|
||||
z = (x+y)*np.exp(-6.0*(x*x+y*y))
|
||||
|
||||
#plt.figure()
|
||||
#plt.pcolor(x,y,z)
|
||||
#plt.colorbar()
|
||||
#plt.title("Sparsely sampled function.")
|
||||
#plt.show()
|
||||
|
||||
# Interpolate function over new 70x70 grid
|
||||
|
||||
xnew,ynew = np.mgrid[-1:1:70j,-1:1:70j]
|
||||
tck = interpolate.bisplrep(x,y,z,s=0)
|
||||
znew = interpolate.bisplev(xnew[:,0],ynew[0,:],tck)
|
||||
|
||||
plt.figure()
|
||||
plt.pcolor(xnew,ynew,znew)
|
||||
plt.colorbar()
|
||||
plt.title("Interpolated function.")
|
||||
plt.show()
|
||||
|
Loading…
Reference in New Issue