Strange behavior with basemap.interp() and masked arrays

Goodman, Alexander (398J-Affiliate)

June 24, 2013 4:30 PM

Just something I
thought I should add to this, but would the following code seem like a reasonable workaround? Basically, since map_coordinates() cannot handle mask arrays, I thought that perhaps passing in the actual mask itself to
interp() with order=3 may produce close to reasonable results, eg:

dataout = interp(datain, xin, yin, xout, yout, masked=True, order=3)

maskin = datain.mask.astype(int)

maskout = interp(datain.mask, xin, yin, xout, yout, order=3)

dataout.mask = dataout.mask | maskout



Alex: The basemap.interp docstring includes a note describing a trick I often use with masked arrays:


If datain is a masked array and order=1 (bilinear interpolation) is
used, elements of dataout will be masked if any of the four surrounding
points in datain are masked. To avoid this, do the interpolation in two
passes, first with order=1 (producing dataout1), then with order=0
(producing dataout2). Then replace all the masked values in dataout1
with the corresponding elements in dataout2 (using numpy.where).
This effectively uses nearest neighbor interpolation if any of the
four surrounding points in datain are masked, and bilinear interpolation

I suppose the same trick might work with order=3, but I have never tried it.