Невозможно обнаружить значение nan в списке, даже если тип данных логически правильный - PullRequest
1 голос
/ 06 мая 2020

Я вызвал список в списке, созданном из пользовательского набора данных с помощью pytorch.

In [1]: sample[1][1]
Out[1]: [0.7, nan, nan, nan, nan]

Я хочу проверить, есть ли в списке значение nan. Я пробовал

In [2]: np.nan in sample[1][1]
Out[2]: False

, но он возвращает ложный вывод. Проверяя один из элементов, я обнаружил, что:

In [3]: sample[1][1][4] == np.nan
Out[3]: False

Предположительно, это должно быть правдой, потому что проверка его типа подсказывает мне:

In [4]: type(sample[1][1][4])
Out[4]: numpy.float64

Нужна помощь, чтобы увидеть, куда я пошел неправильно. Я хочу, чтобы этот список возвращал True, потому что он содержит nan. Любые лиды помогут

Ответы [ 3 ]

3 голосов
/ 06 мая 2020

Вы хотите использовать для этого np.isnan , как вы можете видеть здесь:

In [5]: np.nan==np.nan
Out[5]: False

In [6]: np.isnan(np.nan)
Out[6]: True

Причина немного заумна, но Takehome - использовать np.isnan для тест. Для вашего конкретного случая вы можете сделать

any([np.isnan(i) for i in sample[1][1]])
0 голосов
/ 06 мая 2020

Это странная проблема, так или иначе связанная с реализацией оператора in для вашего объекта sample[1][1].

Решение состоит в преобразовании в список:

In [5]: np.nan in list(sample[1][1])
Out[5]: True

РЕДАКТИРОВАТЬ: это быстрый и грязный способ. Это решение полагается на (np.nan is np.nan) == True. Однако это не гарантируется во всех случаях (см. этот вопрос SO ). Поэтому лучше придерживаться конструкции, которая включает np.isnan(x), например, как указано в нескольких других ответах.

0 голосов
/ 06 мая 2020

Из моих данных:

In [1]: sample[1][1]
Out[1]: [0.7, nan, nan, nan, nan]

Я пробовал обходной путь. Благодаря идее np.isnan(). Добавлены логические значения в массив, и если оно больше 0, то у него должен быть nan.

In [2]: np.isnan(sample[1][1])
Out[2]: array([False, True, True, True, True])
In [3]: np.isnan(sample[1][1]).sum()
Out[3]: 4
In [4]: np.isnan(sample[1][1]).sum()>0
Out[3]: True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...