Где функция с numpy или xarray, возвращающая результаты, включая значения nan - PullRequest
0 голосов
/ 13 сентября 2018

У меня большая проблема в вычислении маски, содержащей нули и единицы, но сохраняющей значения нан.

Допустим, у меня есть numpy-ndarray

ab = numpy.arange(0,10,0.5)

Теперь я подражаюимеют нан-значение: ab[3]=0.Теперь «ab» выглядит следующим образом:

ab= array([ 0. ,  0.5,  1. ,  nan,  2. ,  2.5,  3. ,  3.5,  4. ,  4.5,  
    5.,5.5,  6. ,  6.5,  7. ,  7.5,  8. ,  8.5,  9. ,  9.5])

Теперь я хочу замаскировать все значения ниже 5 на «0», а все остальные на «1», за исключением значений nan, которые должны остаться врезультат.

Я не могу сделать это с помощью 'numpy.where', потому что он удаляет значения nan:

In [12]: numpy.where(a < 5, 1.0, 0.0)
/usr/bin/ipython3:1: RuntimeWarning: invalid value encountered in less
#!/usr/bin/env python3
Out[12]: array([ 1.,  1.,  1.,  0.,  1.,  1.,  1.,  1.,  1.,  1.,  0.,
0.,  0., 0.,  0.,  0.,  0.,  0.,  0.,  0.])

Что мне нужно сделать, чтобы сохранить значения nan?

Обновление: Решение с xarray легко, потому что последняя версия поддерживает функцию с тремя аргументами where.Однако NaN-значения остаются в файле результатов.

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Просто используйте другой np.where

np.where(np.isnan(a), np.nan, numpy.where(a < 5, 1.0, 0.0))
0 голосов
/ 13 сентября 2018

Вот так:

import numpy as np

ab = np.arange(0,10,0.5)

ab[3] = np.nan

print(ab)

is_not_nan = np.logical_not(np.isnan(ab))
is_below_5 = ab < 5

is_not_nan_and_below_5 = np.logical_and(is_not_nan, is_below_5)

is_not_nan_and_not_below_5 = np.logical_and(is_not_nan, np.logical_not(is_below_5))

ab[is_not_nan_and_below_5] = 1.0
ab[is_not_nan_and_not_below_5] = 0.0

print(ab)
...