# [Numpy-discussion] Is this odd?

josef.pktd@gmai... josef.pktd@gmai...
Fri Apr 2 09:16:42 CDT 2010

```On Fri, Apr 2, 2010 at 10:11 AM, Robert Kern <robert.kern@gmail.com> wrote:
> On Thu, Apr 1, 2010 at 22:07, Shailendra <shailendra.vikas@gmail.com> wrote:
>> Hi All,
>> Below is some array behaviour which i think is odd
>>>>> a=arange(10)
>>>>> a
>> array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>>>> b=nonzero(a<0)
>>>>> b
>> (array([], dtype=int32),)
>>>>> if not b[0]:
>> ...     print 'b[0] is false'
>> ...
>> b[0] is false
>>
>> Above case the b[0] is empty so it is fine it is considered false
>>
>>>>> b=nonzero(a<1)
>>>>> b
>> (array([0]),)
>>>>> if not b[0]:
>> ...     print 'b[0] is false'
>> ...
>> b[0] is false
>>
>> Above case b[0] is a non-empty array. Why should this be consider false.
>>
>>>>> b=nonzero(a>8)
>>>>> b
>> (array([9]),)
>>>>> if not b[0]:
>> ...     print 'b[0] is false'
>> ...
>>>>>
>> Above case b[0] is non-empty and should be consider true.Which it does.
>>
>> I don't understand why non-empty array should not be considered true
>> irrespective to what value they have.
>
> We raise an exception for most arrays. We used to evaluate bool(arr)
> as True if any element in arr were nonzero. However, people routinely
> got confused and thought that the behavior was that it would return
> False if any element were zero. It's ambiguous, so we raise an
> exception to prevent errors and misconceptions. Empty arrays are very
> rare, so we decided that evaluating bool(arr) as True if there were
> any elements had very little use case and would still have the
> potential to confuse people. As shown below, there is a better, more
> explicit way to test for emptiness.
>
> However, we do allow single-element arrays to evaluate to True or
> False based on its single element because that is unambiguous. This is
> possibly a mistake, but it tends not to cause too many problems. I
> don't know why we also allow bool(array([])) to evaluate to False,
> too; we probably shouldn't.
>
>> Also, please suggest the best way to differentiate between an empty
>> array and non-empty array( irrespective to what is inside array).
>
> a.size > 0
>
> --
> Robert Kern

with examples:
>>> bool(0)
False
>>> bool(1)
True
>>> bool(np.array([0]))
False
>>> bool(np.array([1]))
True
>>> bool([0])
True
>>> bool([1])
True
>>> bool(np.array([[0]]))
False
>>> bool(np.array([[1]]))
True
>>> np.array([[1]]).size
1

Josef
>
> "I have come to believe that the whole world is an enigma, a harmless
> enigma that is made terrible by our own mad attempt to interpret it as
> though it had an underlying truth."
>  -- Umberto Eco
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion@scipy.org
> http://mail.scipy.org/mailman/listinfo/numpy-discussion
>
```