Подтвердить что ты не робот

Что может быть причиной "недопустимого значения, встречающегося в less_equal" в numpy

Я испытал RuntimeWarning

 RuntimeWarning: invalid value encountered in less_equal

Создано этой строкой моего кода:

center_dists[j] <= center_dists[i]

Оба center_dists[j] и center_dists[i] являются массивами numpy

Что может быть причиной этого предупреждения?

4b9b3361

Ответ 1

Это скорее всего происходит из-за np.nan где-то во входных данных. Пример этого показан ниже -

In [1]: A = np.array([4, 2, 1])

In [2]: B = np.array([2, 2, np.nan])

In [3]: A<=B
RuntimeWarning: invalid value encountered in less_equal
Out[3]: array([False,  True, False], dtype=bool)

Для всех этих сравнений с np.nan он выводит False. Подтвердите это для сравнения broadcasted. Здесь образец -

In [1]: A = np.array([4, 2, 1])

In [2]: B = np.array([2, 2, np.nan])

In [3]: A[:,None] <= B
RuntimeWarning: invalid value encountered in less_equal
Out[3]: 
array([[False, False, False],
       [ True,  True, False],
       [ True,  True, False]], dtype=bool)

Обратите внимание на третий столбец на выходе, который соответствует сравнению с третьим элементом np.nan в B, и это приводит ко всем значениям False.

Ответ 2

В качестве продолжения ответа Дивакара и его комментария о том, как подавить RuntimeWarning, более безопасным способом является подавление их только локально с with np.errstate() (docs): обычно лучше получать оповещения при сравнении с np.nan выведите False и игнорируйте предупреждение только тогда, когда это действительно то, что задумано. Вот для примера OP:

with np.errstate(invalid='ignore'):
  center_dists[j] <= center_dists[i]

При выходе из блока with обработка ошибок сбрасывается до того, что было раньше.

Вместо invalid value encountered можно также игнорировать все ошибки, передавая all='ignore'. Интересно, что это отсутствует в kwargs в документах для np.errstate(), но не в документах для np.seterr(). (Похоже на небольшую ошибку в документации по np.errstate().)