2013-03-28 12 views
13

Podczas przesyłania wartości NumPy Not-a-Number jako wartości logicznej, staje się ona wartością True, np. następująco.Dlaczego wartości "Nie liczba" są równe Prawdziwe, gdy są rzutowane jako boolean w Pythonie/Numpy?

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

Jest to przeciwieństwo tego, czego intuicyjnie oczekiwałbym. Czy istnieje zasada dźwięku, która jest podstawą tego zachowania?

(podejrzewam, że może być tak samo zachowanie wydaje się występować w oktawie.)

+0

Moje przeczucie: NaN nie jest równe zero, więc jest prawdziwe, gdy jest konwertowane na wartość logiczną. Jeśli NaN byłyby fałszywe, konwersja jednostek pływających na wartości logiczne wymagałaby dwóch sprawdzeń, jednej dla zera i jednej dla NaN. (Ale podejrzewam, że interpretowanie pseudonimów Numpy jako booleansa nie jest tak powszechną praktyką ...) –

+4

Jest tak również w C (na którym opiera się NumPy). Ze standardu: 'Gdy dowolna wartość skalarna jest konwertowana na _Bool, wynikiem jest 0, jeśli wartość jest równa 0; w przeciwnym razie wynikiem jest 1. "Przypis 59 jednoznacznie stwierdza, że" NaNy nie porównują się z 0 i w ten sposób przekształcają się w 1. " – jerry

Odpowiedz

13

To jest w żaden sposób NumPy specyficzne, ale jest zgodne z tym, jak Python traktuje Nans:

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

Reguły są wyrażone w documentation.

Myślę, że można rozsądnie twierdzić, że wartość prawdy NaN powinna być fałszywa. Jednak nie jest tak, jak teraz działa ten język.

3

0.0 jest jedynym falsy wartość pływak ponieważ to, co projektanci języka postanowił byłoby najbardziej przydatne. Numpy po prostu podąża za tobą. (Byłoby dziwne, gdyby bool(np.nan) był False, gdy bool(float('nan')) jest True).

Myślę, że to prawdopodobnie dlatego, że tak działa z liczbami całkowitymi. Wprawdzie liczby całkowite nie mają wartości typu NaN lub inf, ale przypuszczam, że przypadki specjalne nie są wystarczająco szczególne, aby złamać reguły.

+0

To nie zależy od projektantów języka; ludzie Numpy mogli również zdecydować się na fałsz "nan". –

+0

@larsmans - Wystarczająco fair. Nie zauważyłem, że "numpy" było częścią pytania OP. Nie sądzę, że to naprawdę coś zmienia. Po prostu ma sens, aby 'numpy' robił to, co robi python. – mgilson

+0

Należy pamiętać, że -0.0 jest również Fałsz. To na początku może nie być trywialne. – Jostikas

5

Pythona truth-value testing stwierdzono, że następujące wartości uznaje False:

  • zerowe każdego rodzaju liczbowa, na przykład, 0 0L 0,0 0J,.

Numpy prawdopodobnie wybrał trzymać się tego zachowania i zapobiec NaN od oceny do False w kontekście logicznym. Pamiętaj jednak, że możesz przetestować NaN na numpy.isnan.

2

Numpy podąża za python standard for truth testing tutaj, każdy typ liczbowy ocenia się na False wtedy i tylko wtedy, gdy jego wartość liczbowa wynosi zero.

Należy pamiętać, że testowanie prawdy wartościami NaN może być również nieintuicyjne w inny sposób (np. nan == nan ocenia na False).

+0

Myślę, że miałeś na myśli "... ocenia" Fałsz ", jeśli ..." –

+0

@Warren - w rzeczy samej! Dzięki. – Kelsey

Powiązane problemy