[Numpy-discussion] Numpy-discussion Digest, Vol 22, Issue 33

Keith Goodman kwgoodman at gmail.com
Wed Jul 9 15:45:17 EDT 2008


On Wed, Jul 9, 2008 at 12:43 PM, Catherine Moroney
<Catherine.M.Moroney at jpl.nasa.gov> wrote:
>>
>> > 2008/7/9 Catherine Moroney <Catherine.M.Moroney at jpl.nasa.gov>:
>> >
>> >> I have a question about performing element-wise logical operations
>> >> on numpy arrays.
>> >>
>> >> If "a", "b" and "c" are numpy arrays of the same size, does the
>> >> following syntax work?
>> >>
>> >> mask = (a > 1.0) & ((b > 3.0) | (c > 10.0))
>> >>
>> >> It seems to be performing correctly, but the documentation that
>> I've
>> >> read indicates that "&" and "|" are for bitwise operations, not
>> >> element-by-
>> >> element operations in arrays.
>> >>
>> >> I'm trying to avoid using "logical_and" and "logical_or" because
>> they
>> >> make the code more cumbersome and difficult to read.  Are "&"
>> and "|"
>> >> acceptable substitutes for numpy arrays?
>> >
>> > Yes. Unfortunately it is impossible to make python's usual logical
>> > operators, "and", "or", etcetera, behave correctly on numpy
>> arrays. So
>> > the decision was made to use the bitwise operators to express
>> logical
>> > operations on boolean arrays. If you like, you can think of boolean
>> > arrays as containing single bits, so that the bitwise operators
>> *are*
>> > the logical operators.
>> >
>> > Confusing, but I'm afraid there really isn't anything the numpy
>> > developers can do about it, besides write good documentation.
>> >
>> Do "&" and "|" work on all types of numpy arrays (i.e. floats and
>> 16 and 32-bit integers), or only on arrays of booleans?  The short
>> tests I've done seem to indicate that it does, but I'd like to have
>> some confirmation.
>>
>> They work for all integer types but not for float or complex types:
>>
>> In [1]: x = ones(3)
>>
>> In [2]: x | x
>> ----------------------------------------------------------------------
>> -----
>> TypeError                                 Traceback (most recent
>> call last)
>>
>> /home/charris/<ipython console> in <module>()
>>
>> TypeError: unsupported operand type(s) for |: 'float' and 'float'
>>
>>
>> Comparisons always return boolean arrays, so you don't have to
>> worry about that.
>>
>> Chuck
>>
> I've attached a short test program for numpy arrays of floats for which
> "&" and "|" seem to work.  If, as you say, "&" and "|" don't work for
> floats, why does this program work?
>
> from numpy import *
>
> a = array([(1.1, 2.1),(3.1, 4.1)],'float')
> b = a + 1
> c = b + 1
>
> print "a = ",a
> print "b = ",b
> print "c = ",c
>
> mask = (a < 4.5) & (b < 4.5) & (c < 4.5)
> print "mask = ",mask
>
> print "masked a = ",a[mask]
> print "masked b = ",b[mask]
> print "masked c = ",c[mask]

a contains floats. But a > 4.5 doesn't:

>> a = np.array([(1.1, 2.1),(3.1, 4.1)],'float')
>> a

array([[ 1.1,  2.1],
       [ 3.1,  4.1]])

>> a < 4.5

array([[ True,  True],
       [ True,  True]], dtype=bool)

>> a | a
---------------------------------------------------------------------------
TypeError: unsupported operand type(s) for |: 'float' and 'float'



More information about the NumPy-Discussion mailing list