Numeric: 'where' function conditions

J

Jorl Shefner

Could anyone tell me the efficient way to do this? Extracting values
from an array for a single condition (say all values greater than 'x')
using 'where' and 'compress' is simple enough.
from Numeric import arange,where,compress
data= arange(10)
data= [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
mask= where((data > 3),1,0)
result= compress(mask,data)
result
array([4, 5, 6, 7, 8, 9])

But, 'where' doesn't appear to allow for multiple conditions in one
statement. For instance, I'd like to do something like:

mask= where((3 < data <= 7),1,0)

but, this won't work.

So, the best I could come up with was this more complicated process that
requires 2 separate masks and an extra temporary array.
mask1= where((data > 3),data,0)
mask1 array([0, 0, 0, 0, 4, 5, 6, 7, 8, 9])
mask2= where((mask1<= 7),mask1,0)
mask2 array([0, 0, 0, 0, 4, 5, 6, 7, 0, 0])
r= compress(mask2,data)
r
array([4, 5, 6, 7])

Is there a more concise way?

Thanks,

J.S.
 
R

Robert Kern

Jorl said:
Could anyone tell me the efficient way to do this? Extracting values
from an array for a single condition (say all values greater than 'x')
using 'where' and 'compress' is simple enough.

from Numeric import arange,where,compress
data= arange(10)
data= [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
mask= where((data > 3),1,0)
result= compress(mask,data)
result

array([4, 5, 6, 7, 8, 9])

But, 'where' doesn't appear to allow for multiple conditions in one
statement. For instance, I'd like to do something like:

mask= where((3 < data <= 7),1,0)

but, this won't work.

Right. "3 < data" creates an array of 0s and 1s where the condition is
false and true, respectively. You don't need where() at all.

Try

mask = logical_and(3 < data, data <= 7)

--
Robert Kern
(e-mail address removed)

"In the fields of hell where the grass grows high
Are the graves of dreams allowed to die."
-- Richard Harter
 
J

Jorl Shefner

Robert Kern <[email protected]> said:
Right. "3 < data" creates an array of 0s and 1s where the condition is
false and true, respectively. You don't need where() at all.

Try

mask = logical_and(3 < data, data <= 7)

Great. That's exactly what I needed. Thanks.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
474,212
Messages
2,571,101
Members
47,695
Latest member
KayleneBee

Latest Threads

Top