# Logical Operators

## Question

How do you do element-wise `and` and `or` operations on arrays?

In IDL, the `and` and `or` operators are logical operators which, when applied to an array, operate element-wise on the array and in sequence following standard operator precedence. Thus, in IDL:

```IDL> a = [3, 6, 9]
IDL> print, (a gt 4) and (a lt 8)
0   1   0
```

In Python, however, `and` and `or` are boolean operators and when operated on arrays do not return element-wise comparison but either one of the operands. Thus, if you have the expression `x and y`, `x` is returned if `x` is `False` and `y` otherwise; see Martelli (2003, p. 44) for details. Thus, in Python:

```>>> import Numeric as N
>>> a = N.array([3, 6, 9])
>>> a > 4
[0,1,1,]
>>> a < 8
[1,1,0,]
>>> (a > 4) and (a < 8)
[1,1,0,]
```

since `a > 4` evaluates as `True` (because it is non-empty), the `and` statement returns the result of `a < 8` as the final result.

(Note that this issue arises with `Numeric` arrays but not with `numarray` arrays. With `numarray` arrays, an attempt to treat an array like a truth value (e.g. with an `and` statement) will throw a `RuntimeError` exception.)

To get element-wise comparison, use the `logical_and` and `logical_or` functions in `Numeric`:

```>>> import Numeric as N
>>> a = N.array([3, 6, 9])
>>> N.logical_and(a > 4, a < 8)
[0,1,0,]
```