Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

BUG: ma.masked_invalid(a, copy=False) does not modify a #19332

Copy link
Copy link
Closed
@QuLogic

Description

@QuLogic
Issue body actions

According to masked_invalid docs, it is a shortcut for masked_where, which says that copy=False will modify a in place.

But masked_where didn't quite do this, and was recently changed in 1.21 to match what the docs actually say in #18967. While it seems to have propagated to e.g., masked_less, it has not affected masked_invalid, which continues to not modify a.

Note though, that unlike masked_where, a partially masked input array does not 'fix' copy=False to match the docs, as in #18946. So changing this behaviour might be more problematic and it might be better to make this explicit in the docs instead.

Reproducing code example:

masked_where modifies input:

In [1]: import numpy as np

In [25]: a = np.ma.array([np.inf, 1, 2, 3, 4])

In [26]: a
Out[26]: 
masked_array(data=[inf,  1.,  2.,  3.,  4.],
             mask=False,
       fill_value=1e+20)

In [28]: np.ma.masked_where(a == 3, a, copy=False)
Out[28]: 
masked_array(data=[inf, 1.0, 2.0, --, 4.0],
             mask=[False, False, False,  True, False],
       fill_value=1e+20)

In [29]: a
Out[29]: 
masked_array(data=[inf, 1.0, 2.0, --, 4.0],
             mask=[False, False, False,  True, False],
       fill_value=1e+20)

Other wrappers like masked_equal modify input:

In [30]: a = np.ma.array([np.inf, 1, 2, 3, 4])

In [31]: np.ma.masked_equal(a, 3, copy=False)
Out[31]: 
masked_array(data=[inf, 1.0, 2.0, --, 4.0],
             mask=[False, False, False,  True, False],
       fill_value=3.0)

In [32]: a
Out[32]: 
masked_array(data=[inf, 1.0, 2.0, --, 4.0],
             mask=[False, False, False,  True, False],
       fill_value=1e+20)

But masked_invalid does not:

In [33]: a = np.ma.array([np.inf, 1, 2, 3, 4])

In [34]: np.ma.masked_invalid(a, copy=False)
Out[34]: 
masked_array(data=[--, 1.0, 2.0, 3.0, 4.0],
             mask=[ True, False, False, False, False],
       fill_value=1e+20)

In [35]: a
Out[35]: 
masked_array(data=[inf,  1.,  2.,  3.,  4.],
             mask=False,
       fill_value=1e+20)

And unlike masked_where before, it does not magically work again for a partially masked array:

In [36]: a = np.ma.array([np.inf, 1, 2, 3, 4], mask=[False, False, False, True, False])

In [37]: a
Out[37]: 
masked_array(data=[inf, 1.0, 2.0, --, 4.0],
             mask=[False, False, False,  True, False],
       fill_value=1e+20)

In [38]: np.ma.masked_invalid(a, copy=False)
Out[38]: 
masked_array(data=[--, 1.0, 2.0, --, 4.0],
             mask=[ True, False, False,  True, False],
       fill_value=1e+20)

In [39]: a
Out[39]: 
masked_array(data=[inf, 1.0, 2.0, --, 4.0],
             mask=[False, False, False,  True, False],
       fill_value=1e+20)

NumPy/Python version information:

1.21.0 3.7.6 | packaged by conda-forge | (default, Mar  5 2020, 15:27:18) 
[GCC 7.3.0]

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      Morty Proxy This is a proxified and sanitized view of the page, visit original site.