IT Share you

mean, nanmean 및 warning : 빈 슬라이스의 평균

shareyou 2021. 1. 8. 21:44
반응형

mean, nanmean 및 warning : 빈 슬라이스의 평균


두 개의 numpy 배열을 구성한다고 가정하십시오.

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

지금은 찾을 np.mean수익률 nan모두 ab:

>>> np.mean(a)
nan
>>> np.mean(b)
nan

numpy 1.8 (2016 년 4 월 20 일 출시) 이후로 을 무시하는 nanmean을 받았습니다 nan.

>>> np.nanmean(b)
3.0

배열이 아무것도없는 경우에는, 그러나 nan 값을,이 경고를 발생합니다 :

>>> np.nanmean(a)
nan
C:\python-3.4.3\lib\site-packages\numpy\lib\nanfunctions.py:598: RuntimeWarning: Mean of empty slice
  warnings.warn("Mean of empty slice", RuntimeWarning)

나는 경고를 억제하는 것을 좋아하지 않습니다. nanmean경고없이 동작을 얻는 데 사용할 수있는 더 나은 기능이 있습니까?


경고 만 억제하지 않을 이유가 전혀 없습니다.

가장 안전한 방법은 warnings.catch_warnings컨텍스트 관리자 를 사용하여 경고가 발생할 것으로 예상되는 곳에서만 경고를 억제하는 것입니다. 이렇게하면 RuntimeWarnings코드의 다른 부분에서 예기치 않게 발생할 수있는 추가 사항 놓치지 않습니다 .

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의 솔루션도 작동하지만 궁극적으로 np.nanmean모든 NaN 배열에서 계산을 피하기 위해 취해야하는 추가 단계 는 경고를 억제하여 피할 수있는 추가 오버 헤드를 발생시킵니다. 또한 귀하의 의도가 코드에 훨씬 더 명확하게 반영됩니다.


NaN값 자체와 동일하지 정의된다 :

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

이 동작을 얻기 위해 Python 조건부와 nan의 속성을 절대 동일하지 않게 사용할 수 있습니다.

>>> 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

다음을 수행 할 수도 있습니다.

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    

ReferenceURL : https://stackoverflow.com/questions/29688168/mean-nanmean-and-warning-mean-of-empty-slice

반응형