Что может быть причиной "недопустимого значения, встречающегося в less_equal" в numpy
Я испытал RuntimeWarning
RuntimeWarning: invalid value encountered in less_equal
Создано этой строкой моего кода:
center_dists[j] <= center_dists[i]
Оба center_dists[j]
и center_dists[i]
являются массивами numpy
Что может быть причиной этого предупреждения?
Ответы
Ответ 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()
.)