James,
As far as I know the netCDF4 Python module cannot be told to always
return a masked array.
Here's a workaround, though:
import numpy as np
def check_record(data):
"""Check if a record is masked and return True if it is;
return False otherwise."""
try:
if data.mask.all():
# all entries are masked
return True
else:
# some entries might be masked
return False
except AttributeError:
# the "mask" attribute was not found
return False
# and here's some code to test it:
a = np.zeros((10,10))
b = np.ma.array(a)
c = b.copy()
c.mask = True
print "checking if 'a' is masked:", check_record(a)
print "checking if 'b' is masked:", check_record(b)
print "checking if 'c' is masked:", check_record(c)
In most cases it is better to use exceptions instead of type checks in
Python code; see http://en.wikipedia.org/wiki/Duck_typing and
http://en.wikipedia.org/wiki/Python_syntax_and_semantics#Exceptions
I hope this helps.
--
Constantine
On Tue, Jan 21, 2014 at 7:17 AM, James Adams <monocongo@xxxxxxxxx> wrote:
> When I read data for a lon/lat point from a NetCDF variable I get a
> MaskedArray if all values are missing and an ndarray if all values are
> present. I'd like to instead get it returned in one way or the other
> in either case, preferably as a MaskedArray so I can check if all
> values are masked and skip to the next lon/lat point. Can someone
> advise as to how I can best go about this?
>
> I'm using the netCDF4 Python module from here:
> https://code.google.com/p/netcdf4-python/
>
> My code looks like this:
>
> # get a "chunk" of data from the NetCDF variable
> precipChunk = inputPrecipVariable[0:len(inputTimeDimension):1,
> lonChunkOffset:lonChunkOffset + lonChunkSize:lonChunkSize,
> latChunkOffset:latChunkOffset + latChunkSize:latChunkSize]
>
> # skip this entire chunk if all values are masked
> if (precipChunk.mask.all()):
> continue
>
> The above works fine if the data (precipChunk) is returned as a
> MaskedArray, but it bombs out if it's returned as an ndarray. Maybe I
> should do some sort of type check on the returned array before
> checking to see if all values are masked? Is data only returned as a
> MaskedArray if *all* values are missing/fill values, or can it happen
> that a section of data which does contain valid values is also
> returned as MaskedArray with the valid data values unmasked?
>
> Thanks in advance for any suggestions and/or insight.
>
> --James
>
> _______________________________________________
> netcdfgroup mailing list
> netcdfgroup@xxxxxxxxxxxxxxxx
> For list information or to unsubscribe, visit:
> http://www.unidata.ucar.edu/mailing_lists/