[Numpy-discussion] Bug with MA and reduce?

Eric Firing efiring at hawaii.edu
Fri Jul 27 14:05:21 EDT 2007


Ludwig M Brinckmann wrote:
> This is a follow-up to an earlier mail that reported a suspected bug in 
> the reduce/minimum operation of numpy.ma <http://numpy.ma>.
> 
> I have tried the same code with the scipy sandbox maskedarray 
> implementation and that gives me the correct output. For comparison:

Yes, I think I see where the bug is coming from in numpy.ma; it is 
assigning fill values for min and max operations as if all integer types 
were the system default integer.
Maskedarray uses a dictionary to assign fill values for these 
operations, so it correctly takes into account the type.

Maskedarray has had much more recent development and maintenance than 
ma, and may replace it in numpy 1.1.  I have not seen any objections to 
this proposal.  From my standpoint, the sooner it happens, the 
better--unless someone raises a fundamental objection to the approach 
maskedarray is taking.

Eric

> 
> # import numpy.core.ma <http://numpy.core.ma> as MA
> import maskedarray as MA
> shape = (100)
> data = numpy.ones(shape, numpy.int16)
> data[2:40] = 3
> data[45:70] = -999
> mask = MA.make_mask_none (data.shape)
> mask[data == -999] = True
> ma = MA.MaskedArray(data, mask = mask)
> min = MA.minimum.reduce(ma,0)
> print min
> 
> With maskedarray I get, as expected 1, with numpy.core.ma 
> <http://numpy.core.ma> I get -1, a value that is not in the array.
> 
> I am using Python 2.44 on XP, the maskedarray is the svn latest, the 
> numpy.core.ma <http://numpy.core.ma> was 1.0.2, but I have tested it 
> with only the current svn version of ma.py and it produces the wrong output.
> 
> 
> Ludwig
> 
> 
> 
> On 27/07/07, *Ludwig M Brinckmann* <ludwigbrinckmann at gmail.com 
> <mailto:ludwigbrinckmann at gmail.com>> wrote:
> 
>     I have ma.minimum.reduce return a minimum value that does not exist
>     in the array.
> 
>     The following code prints -1 as the minimum of the MA, I believe it
>     should be 1.
> 
>     import numpy
>     shape = (100)
>     data = numpy.ones (shape, numpy.int16)
>     data[2:40] = 3  # dummy data
>     data[45:70] = -999 # null values
>     mask = numpy.ma.make_mask_none(data.shape)
>     mask[data == -999] = True
>     ma = numpy.ma.MaskedArray(data, mask = mask)
>     min = numpy.ma.minimum.reduce(ma,0)
>     print min
> 
>     Am I doing something really stupid here?
> 
>     Ludwig
> 
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> Numpy-discussion mailing list
> Numpy-discussion at scipy.org
> http://projects.scipy.org/mailman/listinfo/numpy-discussion




More information about the NumPy-Discussion mailing list