[gdal-dev] GDAL and numpy, masking arrays

Armin Burger armin.burger at gmx.net
Wed Nov 12 15:54:50 EST 2008


Chris

thanks a lot for the quick and very helpful explanations. Is there a 
possibility to reset the masked values '--' after the calculation to a 
special value?

Best regards

Armin

On 12/11/2008 21:27, Christopher Barker wrote:
> Armin Burger wrote:
>> maybe someone on this list has some experience using numpy in 
>> combination with GDAL/Python and could give me some advice.
> 
> For further questions about numpy, the numpy list is very helpful.
> 
> 
>> difference can be easily calculated after reading both images into an 
>> array and substract one from the other.
> 
>> The problem is that both images can contain clouds or snow that have 
>> predefined pixel values (252,253).
> 
>> Does anybody know if this is possible and how to perform it?
> 
> yep.
> 
>> Looking through the numpy docs I was not able to identify required 
>> methods or functions for this. There is something like 'masked arrays' 
>> but I have not understood if this could be used for my purpose.
> 
> This is exactly the kind of thing masked arrays are for. Yu can create a 
> masked array out of your data with something like:
> 
>  >>> a
> array([ 1,  2,  3,  4,  5,  6,  3,  4, 67,  4,  3,  5,  6,  7])
> 
> #a regular array
> 
>  >>> import numpy.ma as ma
> 
> # create a masked array with the mask set at all elements with a value 
> of 3:
>  >>> a = ma.masked_values(a, 3)
>  >>> a
> masked_array(data = [1 2 -- 4 5 6 -- 4 67 4 -- 5 6 7],
>       mask = [False False  True False False False  True False False 
> False  True False
>  False False],
>       fill_value=3)
> 
> #another one:
>  >>> b = np.array((1,3,4,2,4,7,4,5,23,5,7,3,8,5))
>  >>> b = ma.masked_values(b, 3)
>  >>> b
> masked_array(data = [1 -- 4 2 4 7 4 5 23 5 7 -- 8 5],
>       mask = [False  True False False False False False False False 
> False False  True
>  False False],
>       fill_value=3)
> 
> 
> add them together:
>  >>> c = a+b
>  >>> c
> masked_array(data = [2 -- -- 6 9 13 -- 9 90 9 -- -- 14 12],
>       mask = [False  True  True False False False  True False False 
> False  True  True
>  False False],
>       fill_value=3)
> 
> 
> If your values are Floating Point, then Another option would be to 
> replace all the "cloud" values with NaN:
> 
>  >>> a = np.array((1,2,3,4,5,6,3,4,67,4,3,5,6,7), dtype=np.float)
>  >>> a[a==3] = np.nan
>  >>> a
> array([  1.,   2.,  NaN,   4.,   5.,   6.,  NaN,   4.,  67.,   4.,  NaN,
>          5.,   6.,   7.])
>  >>> b = np.array((1,3,4,2,4,7,4,5,23,5,7,3,8,5), dtype=np.float)
>  >>> b[b==3] = np.nan
>  >>> b
> array([  1.,  NaN,   4.,   2.,   4.,   7.,   4.,   5.,  23.,   5.,   7.,
>         NaN,   8.,   5.])
>  >>> a+b
> array([  2.,  NaN,  NaN,   6.,   9.,  13.,  NaN,   9.,  90.,   9.,  NaN,
>         NaN,  14.,  12.])
> 
> 
> -Chris
> 
> 
> 


More information about the gdal-dev mailing list