On Fri, Jan 27, 2012 at 20:46, Bartosz Telenczuk
<b.telenc...@biologie.hu-berlin.de> wrote:
> I have been using numpy for several years and I am very impressed with its 
> flexibility. However, there is one problem that has always bothered me.
>
> Quite often I need to test consistently whether a variable is any of the 
> following: an empty list, an empty array or None. Since both arrays and lists 
> are ordered sequences I usually allow for both, and convert if necessary. 
> However, when the (optional) argument is an empty list/array or None,  I skip 
> its processing and do nothing.
>
> Now, how should I test for 'emptiness'?
>
> PEP8 recommends:
>
> For sequences, (strings, lists, tuples), use the fact that empty sequences 
> are false.
>
>>> seq = []
>>> if not seq:
> ...    print 'Hello'
>
> It works for empty numpy arrays:
>
>>> a = np.array(seq)
>>> if not a:
> ...     print 'Hello"
> Hello
>
> but if 'a' is non-empty it raises an exception:
>
>>> a = np.array([1,2])
>>> if not a:
> ...     print 'Hello"
> ValueError: The truth value of an array with more than one element is 
> ambiguous. Use a.any() or a.all()
>
> One solution is to test lengths:
>
>>> if len(seq) > 0:
> ....    ...
>>> if len(a) > 0:
> ...     ...
>
> but for None it fails again:
>
>>> opt = None
>>> if len(opt):
> ...
> TypeError: object of type 'NoneType' has no len()
>
> even worse we can not test for None, because it will fail if someone 
> accidentally wraps None in an array:
>
>>> a = np.array(opt)
>>> if opt is not None:
> ...      print 'hello'
> hello
>
> Although this behaviour is expected, it may be very confusing and it easily 
> leads to errors. Even worse it adds unnecessary complexity in the code, 
> because arrays, lists and None have to be handled differently.
>
> I hoped the I managed to explain the problem well. Is there a recommended way 
> to test for empty arrays?

[~]
|5> x = np.zeros([0])

[~]
|6> x
array([], dtype=float64)

[~]
|7> x.size == 0
True


Note that checking for len(x) will fail for some empty arrays:

[~]
|8> x = np.zeros([10, 0])

[~]
|9> x.size == 0
True

[~]
|10> len(x)
10

There is no way to test all of the cases (empty sequence, empty array,
None) in the same way. Usually, it's a bad idea to conflate the three.

-- 
Robert Kern

"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

Reply via email to