 Photo by Alesia Kozik

# The truth value of an array with more than one element is ambiguous. use a.any() or a.all()

Numpy is a powerful library for manipulating multi-dimensional arrays. Sometimes we want to perform logical operations on these arrays, but then it becomes logically ambigeous what the result should be. This is when we arrive at the The truth value of an array with more than one element is ambiguous. use a.any() or a.all() problem. This article gives a quick guide on how to use logical operations on numpy array

## Problem

The most common scenario in which we arrive at the problem mentioned is as follows. We start with a numpy array, `x`, we wish to select from `x` elements that satisfy ceratin conditions, say `x > 2 and x < 5 `. But trying this out, it does not work, lets see this in code

``````
import numpy as np

# define our numpy array
x = np.array([1,2,3,4,5])

# now try to select elements > 2 and < 5 (so we want 3,4)
x[x > 2 and x < 5]``````

Running this we arrive at this error, informing us that the truth value of an array with more than one element is ambigeous, we get the same error if we use the `or` operator instead of the `and` operator

``````
ValueError                                Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_9744/1541067368.py in
5
6 # now try to select elements > 2 and < 5 (so we want 3,4)
----> 7 x[x > 2 and x < 5]

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
``````

Using and/or operators on arrays with more than one element gives an error

Now, lets try to solve this problem, our solution will present two key ideas, the usage of binary operators `&`,`|` as well as numpy methods `.any()` and `.all()`. This will be a good reminder on the difference between `&` and `and` operators, and the ```| ``` and `or` operators, although they can be used interchangably for one-element variables, their behaviour might differ for variables with more than one element.

## Solution

Our solution has two steps. Lets consider the boolean expression `x > 2 and x < 5` in detail. First we want to compute `(x > 2)`, this returns a boolean array of `True` where an element is greater than 2, and `False` where an element is less than or equal to 2, lets try this in code

``````
print(x > 2)
print(x < 5)``````

As expected, for each condition, we get a `True` in the position of elements satisfying condition and `False` otherwise, For example, for `x = [1,2,3,4,5]` and condition `x>2`, first 2 elements fail the condition, and last 3 elements pass the condition, so we get `[False False True True True]`, the following is our ouptu after running the 2 lines of code above

``````
[False False  True  True  True]
[ True  True  True  True False]``````

Next we have either one of two choices. If we want to specify elements satisfying conditions using indexes, then we want to perform element-wise operations. Hence, for `and` we resort to either `&` operator or the `np.logical_and()` method. For `or` we can use `|` operator or `np.logical_or` method. So again lets try to select elements satisfying `x > 2 and x < 5`

``````
print(x[(x > 2) & (x < 5)])
print(x[np.logical_and(x > 2,x < 5)])``````

Notice how when using the `&` operator, we need to use `()`, since the `&` operator takes precedence over the > and < operators. Running the code above we get our two desired elements satisfying the conditions, `3,4`

The & operator takes precedence over the > , < operators, so use of () is necessary
``````
[3 4]
[3 4]``````

Use & or np.logical_and() for element-wise and operation on arrays with more than one element

We can repeat the same code again for or, using either the `|` operator or `np.logical_or` method

Use | or np.logical_or() for element-wise or operation on arrays with more than one element

Now what if our original goal was to get a single boolean value? Just either `True`, if there is any element satisfying this condition or `False` otherwise. Or what if we want a single boolean value which is `True` if all elements satisfy the condition and `Falase` otherwise? This is when we can add the `.any()` and `.all()` methods to the above code.

``````
print(((x > 2) & (x < 5)).any())
print(np.logical_and(x > 2,x < 5).all())``````

In the above code, we can use `&` and `np.logical_and()` interchangeably. When using the `.any()` function we expect the result to be `True` since some elements like `3,4` satisfy the condition. However when using the `.all()` method, we expect the result to be `False` since not all elements satisfy the condition like `1,5`, Here is the output of the above code

``````
True
False``````

Use .all() to AND all values of an array into a single boolean value

Use .any() to OR all values of an array into a single boolean value

## Conclusion

This was a quick guide on how to solve the The truth value of an array with more than one element is ambiguous. use a.any() or a.all() problem, which is an error we face when trying to apply logical operators on arrays with more than one element. We saw how we can use the `&` and `|` operators or interchangeably the `np.logical_and()` and `np.logical_or()` methods to perform element-wise logic operations on elements, hence getting indexes of elements satisfying the condition. We also saw how we can use the `.any()` or `.all()` methods to obtain a single boolean value out of an array of boolean values

If you read this far, tweet to the author to show them you care. The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). zhteja - Aug 1 How To Calculate The Address Of An Element With The Base Address Of A Two Dimensional Array? zhteja - Aug 10 Valueerror: setting an array element with a sequence Ankur Ranpariya - Sep 17 All the input array dimensions except for the concatenation axis must match exactly Ankur Ranpariya - Sep 8 Given an array of ints, return true if the array contains a 2 next to a 2 somewhere. NoirHusky - Sep 8 Value Error: Need More Than (0) Values To Unpack zhteja - Sep 15 ValueError: need more than 1 value to unpack Ayakuza - May 30 There are 4 bytes in an ipv4 address. what is the highest decimal value you can have for one byte? James - Jun 1 Write a function max that has two java string parameters and returns the larger of the two NoirHusky - Sep 2 Valueerror: could not broadcast input array from shape Hussain Zafar - Jun 18 Cannot perform reduce with flexible type Hussain Zafar - Jun 7 [Solved] Typeerror: 'numpy.float64' object is not iterable beekip - Sep 15 'virtualenv' is not recognized as an internal or external command, operable program or batch file Ankur Ranpariya 1 - Aug 22 Jupyter' is not recognized as an internal or external command, operable program or batch file JimCoder - Jul 14 Write a Program to Print First x Terms of the Series 3n+2 which are not Multiples of 4 beekip - Sep 20 Given a List of Non Negative Integers, Arrange them such that they Form the Largest Number Ankur Ranpariya - Jul 27 TypeError: unsupported operand type(s) for -: 'list' and 'list' Ferdy - Sep 9 Numpy.core.multiarray failed to import windows amr12345a - Jun 10 Write a loop that sets newscores to oldscores shifted once left, with element 0 copied to the end. sadmin - Apr 29 Failed to load resource: the server responded with a status of 404 (not found) Ankur Ranpariya - Sep 18