user308827 user308827 - 1 month ago 10
Python Question

Replacing values in array from netCDF

masked_array(data =
[[[-- -- -- ..., -- -- --]
[-- -- -- ..., -- -- --]
[-- -- -- ..., -- -- --]
...,
[-- -- -- ..., -- -- --]
[-- -- -- ..., -- -- --]
[-- -- -- ..., -- -- --]]

[[-- -- -- ..., -- -- --]
[-- -- -- ..., -- -- --]
[-- -- -- ..., -- -- --]
...,
[-- -- -- ..., -- -- --]
[-- -- -- ..., -- -- --]
[-- -- -- ..., -- -- --]]

[[-- -- -- ..., -- -- --]
[-- -- -- ..., -- -- --]
[-- -- -- ..., -- -- --]
...,
[-- -- -- ..., -- -- --]
[-- -- -- ..., -- -- --]
[-- -- -- ..., -- -- --]]

...,
[[-- -- -- ..., -- -- --]
[-- -- -- ..., -- -- --]
[-- -- -- ..., -- -- --]
...,
[-- -- -- ..., -- -- --]
[-- -- -- ..., -- -- --]
[-- -- -- ..., -- -- --]]

[[-- -- -- ..., -- -- --]
[-- -- -- ..., -- -- --]
[-- -- -- ..., -- -- --]
...,
[-- -- -- ..., -- -- --]
[-- -- -- ..., -- -- --]
[-- -- -- ..., -- -- --]]

[[-- -- -- ..., -- -- --]
[-- -- -- ..., -- -- --]
[-- -- -- ..., -- -- --]
...,
[-- -- -- ..., -- -- --]
[-- -- -- ..., -- -- --]
[-- -- -- ..., -- -- --]]],
mask =
[[[ True True True ..., True True True]
[ True True True ..., True True True]
[ True True True ..., True True True]
...,
[ True True True ..., True True True]
[ True True True ..., True True True]
[ True True True ..., True True True]]

[[ True True True ..., True True True]
[ True True True ..., True True True]
[ True True True ..., True True True]
...,
[ True True True ..., True True True]
[ True True True ..., True True True]
[ True True True ..., True True True]]

[[ True True True ..., True True True]
[ True True True ..., True True True]
[ True True True ..., True True True]
...,
[ True True True ..., True True True]
[ True True True ..., True True True]
[ True True True ..., True True True]]

...,
[[ True True True ..., True True True]
[ True True True ..., True True True]
[ True True True ..., True True True]
...,
[ True True True ..., True True True]
[ True True True ..., True True True]
[ True True True ..., True True True]]

[[ True True True ..., True True True]
[ True True True ..., True True True]
[ True True True ..., True True True]
...,
[ True True True ..., True True True]
[ True True True ..., True True True]
[ True True True ..., True True True]]

[[ True True True ..., True True True]
[ True True True ..., True True True]
[ True True True ..., True True True]
...,
[ True True True ..., True True True]
[ True True True ..., True True True]
[ True True True ..., True True True]]],
fill_value = 9e+20)


I am reading the above masked array from a netCDF file. The first slice looks like this:

val[0].data
array([[ 8.99999983e+20, 8.99999983e+20, 8.99999983e+20, ...,
8.99999983e+20, 8.99999983e+20, 8.99999983e+20],
[ 8.99999983e+20, 8.99999983e+20, 8.99999983e+20, ...,
8.99999983e+20, 8.99999983e+20, 8.99999983e+20],
[ 8.99999983e+20, 8.99999983e+20, 8.99999983e+20, ...,
8.99999983e+20, 8.99999983e+20, 8.99999983e+20],
...,
[ 8.99999983e+20, 8.99999983e+20, 8.99999983e+20, ...,
8.99999983e+20, 8.99999983e+20, 8.99999983e+20],
[ 8.99999983e+20, 8.99999983e+20, 8.99999983e+20, ...,
8.99999983e+20, 8.99999983e+20, 8.99999983e+20],
[ 8.99999983e+20, 8.99999983e+20, 8.99999983e+20, ...,
8.99999983e+20, 8.99999983e+20, 8.99999983e+20]], dtype=float32)


How do I replace the 8.99999983e+20 values by 0.0? I thought that these are fill_values but using
ma.set_fill_value(val, 0.0)
does not work (it only changes `fill_value to 0.0, but doesn't change 8.99999983e+20

Answer

The cool thing with masked arrays is that data and mask are separated. The fill_value attribute only affects the filled() method of a masked array, not the data:

>>> import numpy as np
>>> x = np.ma.array([1, 2, 3, 4], mask=[0, 0, 1, 1])
>>> x
masked_array(data = [1 2 -- --],
             mask = [False False  True  True],
       fill_value = 999999)

>>> x.filled()
array([     1,      2, 999999, 999999])
>>> x.set_fill_value(-999)
>>> x.filled()
array([   1,    2, -999, -999])
>>> x.data
array([1, 2, 3, 4])

In your case

val.set_fill_value(0)
print val.filled()

or just val.filled(0) should do the trick.