# [Numpy-discussion] numarray.where confusion

Todd Miller jmiller at stsci.edu
Wed May 26 08:42:16 CDT 2004

```On Wed, 2004-05-26 at 10:48, Alok Singhal wrote:
> Hi,
>
> I am having trouble understanding how exactly "where" works in
> numarray.
>
> What I am trying to do:
>
> I am preparing a two-level mask in an array and then assign values to
> the array where both masks are true:
>
> >>> from numarray import *
> >>> a = arange(10)
> >>> m1 = where(a > 5)
> >>> a[m1]
> array([6, 7, 8, 9])
> >>> m2 = where(a[m1] < 8)
> >>> a[m1][m2]

a[m1] is a new array here.

> array([6, 7])
> >>> # So far so good
> >>> # Now change some values
> >>> a[m1][m2] = array([10, 20])

And here too.  This does a write into what is effectively a temporary
variable returned by the expression a[m1].  Although the write occurs,
it is lost.

> >>> a[m1][m2]
> array([6, 7])
> >>> a
> array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

Here's how I did it (there was an easier way I overlooked):

a = arange(10)
m1 = where(a > 5, 1, 0).astype('Bool')
m2 = where(a < 8, 1, 0).astype('Bool')
a[m1 & m2] = array([10, 20])

The principle here is to keep the masks as "full sized" boolean arrays
rather than index arrays so they can be combined using the bitwise and
operator.   The resulting mask can be used to index just once
eliminating the temporary.

Regards,
Todd

```