[Numpy-discussion] Why does np.nan{min, max} clobber my array mask?

Bruce Southey bsouthey@gmail....
Mon Feb 15 21:24:21 CST 2010


On Mon, Feb 15, 2010 at 8:35 PM, Pierre GM <pgmdevlist@gmail.com> wrote:
> On Feb 15, 2010, at 8:51 PM, David Carmean wrote:
>> On Sun, Feb 14, 2010 at 03:22:04PM -0500, Pierre GM wrote:
>>
>>>
>>> I'm sorry, I can't follow you. Can you post a simpler self-contained example I can play with ?
>>> Why using np.nanmin/max ? These functions are designed for ndarrays, to avoid using a masked array: can't you just use min/max on the masked array ?
>>
>> I was using np.nanmin/max because I did not yet understand how masked arrays worked; perhaps the
>> docs for those methods need a note indicating that "If you can take the (small?) memory hit,
>> use Masked Arrays instead".   Now that I know different... I'm  going to drop it unless you
>> reall want to dig into it.
>
>
> I'm curious. Can you post an excerpt of your array, so that I can check what goes wrong?
>
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion@scipy.org
> http://mail.scipy.org/mailman/listinfo/numpy-discussion
>
Hi,
David, please file a bug report.

I think is occurs with np.nansum, np.nanmin and np.nanmax. Perhaps
some thing with the C99 changes as I think it exists with numpy 1.3.

I think this code shows the problem with Linux and recent numpy svn:

import numpy as np
uut = np.array([[2, 1, 3, np.nan], [5, 2, 3, np.nan]])
msk = np.ma.masked_invalid(uut)
msk
np.nanmin(msk, axis=1)
msk

$ python
Python 2.6 (r26:66714, Nov  3 2009, 17:33:18)
[GCC 4.4.1 20090725 (Red Hat 4.4.1-2)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> uut = np.array([[2, 1, 3, np.nan], [5, 2, 3, np.nan]])
>>> msk = np.ma.masked_invalid(uut)
>>> msk
masked_array(data =
 [[2.0 1.0 3.0 --]
 [5.0 2.0 3.0 --]],
             mask =
 [[False False False  True]
 [False False False  True]],
       fill_value = 1e+20)

>>> np.nanmin(msk, axis=1)
masked_array(data = [1.0 2.0],
             mask = [False False],
       fill_value = 1e+20)

>>> msk
masked_array(data =
 [[2.0 1.0 3.0 nan]
 [5.0 2.0 3.0 nan]],
             mask =
 [[False False False False]
 [False False False False]],
       fill_value = 1e+20)


Bruce


More information about the NumPy-Discussion mailing list