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

Почему значения "Not a Number" равны True, если в Python/Numpy используется как boolean?

При выдаче значения NumPy Not-a-Number в качестве логического значения оно становится True, например. следующим образом.

>>> import numpy as np
>>> bool(np.nan)
True

Это полная противоположность тому, что я хотел бы интуитивно ожидать. Существует ли разумный принцип, лежащий в основе этого поведения?

(Я подозреваю, что, возможно, такое же поведение происходит в Octave.)

4b9b3361

Ответ 1

Это никоим образом не зависит от NumPy, но согласуется с тем, как Python рассматривает NaN:

In [1]: bool(float('nan'))
Out[1]: True

Правила указаны в документации.

Я думаю, можно было бы разумно утверждать, что значение истины NaN должно быть ложным. Однако сейчас это не так, как язык работает.

Ответ 2

Python проверка правдоподобия утверждает, что следующие значения считаются False:

  • нуль любого числового типа, например, 0, 0L, 0.0, 0j.

Numpy, вероятно, предпочла придерживаться этого поведения и не позволяла NaN оценивать до False в булевом контексте. Обратите внимание, что вы можете использовать numpy.isnan для проверки NaN.

Ответ 3

0.0 является единственным значением фальшиво-плавающего, потому что то, что решили разработчики языка, было бы наиболее полезным. Нумером просто следует. (Было бы странно иметь bool(np.nan) be False, когда bool(float('nan')) есть True).

Я думаю, что это, вероятно, потому, что все работает с целыми числами. По общему признанию, целые числа не имеют типов NaN или inf, но я полагаю, что специальные случаи не являются достаточно сложными, чтобы нарушать правила.

Ответ 4

Numpy следует стандарту python для тестирования правды здесь, любой числовой тип оценивается как False тогда и только тогда, когда его числовое значение равно нулю.

Обратите внимание, что тестирование истинности с помощью значений NaN может быть неинтуитивным и другими способами (например, nan == nan оценивается до False).