mean, nanmean and warning: Mean of empty slice

前端 未结 2 2171
自闭症患者
自闭症患者 2020-12-14 05:07

Say I construct two numpy arrays:

a = np.array([np.NaN, np.NaN])
b = np.array([np.NaN, np.NaN, 3])

Now I find that np.mean ret

相关标签:
2条回答
  • 2020-12-14 05:52

    I really can't see any good reason not to just suppress the warning.

    The safest way would be to use the warnings.catch_warnings context manager to suppress the warning only where you anticipate it occurring - that way you won't miss any additional RuntimeWarnings that might be unexpectedly raised in some other part of your code:

    import numpy as np
    import warnings
    
    x = np.ones((1000, 1000)) * np.nan
    
    # I expect to see RuntimeWarnings in this block
    with warnings.catch_warnings():
        warnings.simplefilter("ignore", category=RuntimeWarning)
        foo = np.nanmean(x, axis=1)
    

    @dawg's solution would also work, but ultimately any additional steps that you have to take in order to avoid computing np.nanmean on an array of all NaNs are going to incur some extra overhead that you could avoid by just suppressing the warning. Also your intent will be much more clearly reflected in the code.

    0 讨论(0)
  • 2020-12-14 06:00

    A NaN value is defined to not be equal to itself:

    >>> float('nan') == float('nan')
    False
    >>> np.NaN == np.NaN
    False
    

    You can use a Python conditional and the property of a nan never being equal to itself to get this behavior:

    >>> a = np.array([np.NaN, np.NaN])
    >>> b = np.array([np.NaN, np.NaN, 3])
    >>> np.NaN if np.all(a!=a) else np.nanmean(a)
    nan
    >>> np.NaN if np.all(b!=b) else np.nanmean(b)
    3.0
    

    You can also do:

    import warnings
    import numpy as np
    
    a = np.array([np.NaN, np.NaN])
    b = np.array([np.NaN, np.NaN, 3])
    
    with warnings.catch_warnings():
        warnings.filterwarnings('error')
        try:
            x=np.nanmean(a)
        except RuntimeWarning:
            x=np.NaN    
    print x    
    
    0 讨论(0)
提交回复
热议问题