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,]