Стандартная функция Min не дает последовательного ответа с Nan - PullRequest
0 голосов
/ 04 марта 2019

Я не могу понять поведение функции min.Когда nan является первым элементом, min говорит, что nan является элементом min;когда nan не первый элемент, он дает фактическое минимальное значение в списке.

Почему я получаю здесь другой ответ?

>>> min([float('nan'),10,2,0])
nan

>>> min([10,float('nan'),2,0])
0

1 Ответ

0 голосов
/ 04 марта 2019

Это потому, что любое действительное число по сравнению с NaN равно False, а реализация min логически эквивалентна:

def min(seq):
    minimum, *rest = seq
    for i in rest:
        if i < minimum:
            minimum = i
    return minimum

Если первый элемент списка - NaN, тони один другой элемент в списке не может считаться меньшим, чем NaN, потому что любой i < float('nan') равен False.С другой стороны, если первый элемент не является NaN, то нет никаких шансов, что NaN можно считать наименьшим, потому что любой float('nan') < i равен False.

Если вы хотите, чтобы min игнорировал NaNвместо этого вы можете использовать функцию ключа, чтобы сопоставить ее с бесконечностью:

from math import isnan
print(min([float('nan'),10,2,0], key=lambda i: float('inf') if isnan(i) else i))
print(min([10,float('nan'),2,0], key=lambda i: float('inf') if isnan(i) else i))

Это приводит к выводу:

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