Как проверить наличие np.NaN и / или None в списке - PullRequest
0 голосов
/ 25 января 2019

None считается ложным условием.Но np.NaN считается True при преобразовании в bool.

any([np.nan, np.NaN, None])
#True

Я понимаю, что его можно поймать с помощью np.isnan().Если в моих данных есть комбинация np.NaN, None, np.nan, то как я могу найти их, если присутствует какой-либо из них.

Есть ли более простой способ найти любой из них?

РЕДАКТИРОВАТЬ:

Ожидаемый результат:

func([np.nan, np.NaN, None, 2])
#True
func([np.nan, np.NaN, None,''])
#False

Ответы [ 3 ]

0 голосов
/ 25 января 2019

Другой метод заключается в преобразовании любого числа nan в действительные числа, в этом случае 0.0:

In[91]:
any([np.nan_to_num(x) for x in [np.nan, np.NaN, None]])

Out[91]: False

np.nan_to_num преобразует NaN в 0.0:

In[92]:

[np.nan_to_num(x) for x in [np.nan, np.NaN, None]]
Out[92]: [0.0, 0.0, None]

РЕДАКТИРОВАТЬ

это также будет обрабатывать ваши обновленные данные образца:

In[93]:

any([np.nan_to_num(x) for x in [np.nan, np.NaN, None,'']])
Out[93]: False
0 голосов
/ 25 января 2019

Вот еще один трюк:

arr = [np.nan, None, np.nan]

[i == i if i is not None else False  for i in arr]

Выход:

[False, False, False]

Примечание: np.nan == np.nan возвращает False

Следовательно,

arr = [np.nan, None, np.nan, '']
any([i == i if i is not None and i != '' else False  for i in arr])

Выход:

False

И

arr = [np.nan, None, np.nan, 2]

any([i == i if i is not None and i != '' else False  for i in arr])

Выход:

True

Тайминги:

%timeit any([np.nan_to_num(x) for x in arr])

241 мкс ± 22 мкс на цикл (среднее ± стандартное отклонение из 7 циклов, 1000 циклов в каждом)

%timeit any([isvalid(x) for x in arr])

20,5 мкс ± 1,95 мкс на цикл (среднее ± стандартное отклонение из 7 циклов, 100000 циклов каждый)

%timeit any([i == i if i is not None and i != '' else False  for i in arr])

2,44 мкс ± 137 нс на цикл (среднее ± стандартное отклонение из 7 циклов, 100000 циклов каждый)

0 голосов
/ 25 января 2019

Вы можете определить свою собственную пользовательскую функцию для проверки, находится ли число в вашем допустимом наборе ввода, например:

def isvalid(number):
    if number is None or np.isnan(number):
        return False
    else:
        return True

any([isvalid(x) for x in data])

edit: я понимаю, что вы, вероятно, хотите проверить, не является ли какой-либо из них НЕ действительным, вы можете просто отменить отрицательный результат, чтобы достичь этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...