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

Catherine Moroney Catherine.M.Moroney at jpl.nasa.gov
Wed Jul 9 15:43:53 EDT 2008


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


>



More information about the NumPy-Discussion mailing list