2016-12-16 1 views
1
aa = np.array([2.0, np.NaN]) 
aa[aa>1.0] = np.NaN 

При выполнении приведенного выше кода я получаю следующее. предупреждение, я понимаю причину этого предупреждения, но как его избежать?Заменить значения в массиве numpy, содержащем NaN

RuntimeWarning: invalid value encountered in greater

+0

Вы хотите заменить значения NaN в Numpy массиве или просто устранить 'RuntimeWarning'? Если последнее, 'np.seterr (invalid = 'ignore')' достаточно. Обратите внимание на этот вопрос (http://stackoverflow.com/questions/15192637/runtimewarning-invalid-value-encountered-in-maximum) – gzc

ответ

1

Хранить индексы годные (не - Nans). Во-первых, мы будем использовать эти индексы для индексации в массив и выполнения сравнения, чтобы получить маску, а затем снова индексировать индексы с этой маской, чтобы вернуть индексы, соответствующие исходному порядку. Используя индексы с оригинальным заказом, мы могли бы затем присвоить элементы во входном массиве NaNs.

Таким образом, реализация/решение было бы -

idx = np.flatnonzero(~np.isnan(aa)) 
aa[idx[aa[idx] > 1.0]] = np.nan 

Пример запуска -

In [106]: aa # Input array with NaNs 
Out[106]: array([ 0., 3., nan, 0., 9., 6., 6., nan, 18., 6.]) 

In [107]: idx = np.flatnonzero(~np.isnan(aa)) # Store valid indices 

In [108]: idx 
Out[108]: array([0, 1, 3, 4, 5, 6, 8, 9]) 

In [109]: aa[idx[aa[idx] > 1.0]] = np.nan # Do the assignment 

In [110]: aa # Verify 
Out[110]: array([ 0., nan, nan, 0., nan, nan, nan, nan, nan, nan]) 
+1

В Py3 сравнения с 'np.nan' производят False без предупреждений. – hpaulj