[SciPy-User] [SciPy-user] ValueError: The truth value of an array with more than one element is ambiguous.

Tony Yu tsyu80 at gmail.com
Fri Apr 6 09:40:27 EDT 2012


On Fri, Apr 6, 2012 at 12:54 AM, Tony Yu <tsyu80 at gmail.com> wrote:

>
>
> On Thu, Apr 5, 2012 at 6:46 PM, surfcast23 <surfcast23 at gmail.com> wrote:
>
>> Hi, I have an if statement and what I want it to do is go through arrays
>> and find the common elements in all three arrays. When I try the code below
>> I get this error * ValueError: The truth value of an array with more
>> than one element is ambiguous. Use a.any() or a.all()* Can some one
>> explain the error to me and how I might be able to fix it. Thanks in
>> advance. *if min <= Xa <=max & min <= Ya <=max & min <= Za <=max:
>> print("in range") else: print("Not in range")*
>
>
> This explanation may or may not be clear, but your question is answered
> in this communication<http://mail.python.org/pipermail/python-ideas/2011-October/012278.html>
> .
>
> Roughly:
> 1) Python's default behavior for chained comparisons don't work as you'd
> expect for numpy arrays.
> 2) Python doesn't allow numpy to change this default behavior (at least
> currently, and maybe never<http://mail.python.org/pipermail/python-dev/2012-March/117510.html>
> ).
>
> Nevertheless, you can get around this by separating the comparisons
>
> >>> if (min <= Xa) & (Xa <= max):
>
> Note the use of `&` instead of `and`, which is at the heart of the issue<http://www.python.org/dev/peps/pep-0335/>
> .
>
> Hope that helps,
> -Tony
>

Oops, I think I got myself mixed up in the explanation. Separating the
comparisons fixes one error; For example, the following:

>>> (min <= Xa) & (Xa <= max)

will return an array of bools instead of raising an error (as you would get
with `min <= Xa <= max`). This is what I meant to explain above.

But, throwing an `if` in front of that comparison still doesn't work
because it's ambiguous: Should `np.array([True False])` be true or false?
Instead you should check `np.all(np.array([True False]))`, which evaluates
as False since not-all elements are True, or `np.any(np.array([True
False]))`, which evaluates as True since one element is True.

-Tony
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.scipy.org/pipermail/scipy-user/attachments/20120406/ee505ac4/attachment.html>


More information about the SciPy-User mailing list