2013-03-28 15 views
13

Bir Sayı Olmayan Sayı Değil değeri boolean olarak yayınlarken, True olur, örn. aşağıdaki gibi.Python/Numpy'de boole olarak yayınlandığında neden "Sayı Değil" değerleri eşit olarak True?

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

Bu, sezgisel olarak beklediğim şeyin tam tersidir. Bu davranışın altında yatan bir ses ilkesi var mı?

(ben aynı davranış Octave oluşmaya göründüğü gibi olabilir şüpheli.) Bu dil tasarımcıları en yararlı olacağına karar verdik budur çünkü

+0

Benim önsezim: NaN sıfıra eşit değil, bu yüzden boolean'a dönüştürüldüğünde doğrudur. Eğer NaN yanlış ise, o zaman yüzerlerin boole dönüşümü, biri sıfır, biri de NaN için olmak üzere iki kontrol alır. (Ama boyleans olarak haşhaş şamandıranın yorumlanmasının şüpheli bir uygulama olmadığı şüpheliyim.) –

+4

Bu aynı zamanda C'de de (NumPy'nin temel aldığı) durumdur. Standarttan: 'Herhangi bir skaler değer _Bool'e dönüştürüldüğünde, değer 0'a eşitse sonuç 0 olur; aksi halde, sonuç 1'dir. Dipnot 59, NaN'lerin 0'a eşit olmadığını ve böylece 1'e dönüştürdüğünü açıkça belirtir. – jerry

cevap

13

Bu, hiçbir şekilde NumPy özgü olmakla birlikte, Python NaN'ler nasıl davrandığı ile tutarlıdır:

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

kurallar documentation yer verilmiştir. NaN'nin gerçek değerinin False olması gerektiği makul olarak tartışılabilir diye düşünüyorum. Ancak, bu dil şu anda nasıl değil.

3

0.0 sadece falsy şamandıra değerdir. Numpy sadece takip eder. (bool(float('nan'))bool(float('nan'))True olduğunda bool(np.nan)False olması garip olurdu).

Sanırım bunun nedeni, işlerin tamsayılarla çalışması. Kuşkusuz, tamsayıların NaN veya inf tipi değerleri yoktur, ancak özel durumların kuralları ihlal edecek kadar özel olmadığını varsayalım.

+0

Dil tasarımcılarına göre değil; Numpy halkı da “nan” i yanlış yapmaya karar verebilirdi. –

+0

@larsmans - Yeterince adil. Bu numpy'nin OP'nin sorusunun bir parçası olduğunu fark etmedim. Bunun gerçekten bir şey değiştirdiğini düşünmüyorum. Sadece "numpy" nin python'un yaptığı şeyi yapması mantıklıdır. – mgilson

+0

-0.0'ın da Yanlış olduğunu unutmayın. Öncelikle önemsiz olmayan bir şey. – Jostikas

5

Python truth-value testing Aşağıdaki değerler False kabul edilir olduğunu belirtmektedir:

  • örneğin, herhangi bir sayısal tür sıfır, 0, 0L, 0.0 0j.

Numpy muhtemelen bu davranışıyla sopa ve bir boolean bağlamda False için değerlendirilmesi gelen NaN önlemek için seçti. Ancak, NaN'yi test etmek için numpy.isnan'u kullanabileceğinizi unutmayın.

2

Numpy, python standard for truth testing'u burada izler, herhangi bir sayısal tür False değerini değerlendirir ve yalnızca sayısal değeri sıfır ise.

NaN değerleriyle yapılan gerçeklerin test edilmesinin diğer yollarla da olabileceğini unutmayın (ör. nan == nan, False olarak değerlendirilir).

+0

Bence "... False için değerlendirirse ..." –

+0

@Warren - gerçekten! Teşekkürler. – Kelsey

İlgili konular