Cleb - 1 year ago 135
Python Question

# Extract values from a list using an array with boolean expressions

I have a list of tuples like this:

``````listOfTuples = [(0, 1), (0, 2), (3, 1)]
``````

and an array that could look like this:

``````myArray = np.array([-2, 9, 5])
``````

Furthermore, I have an array with Boolean expressions which I created like this:

``````dummyArray = np.array([0, 1, 0.6])
myBooleanArray =  dummyArray < 1
``````

`myBooleanArray`
therefore looks like this:

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

Now I would like to extract values from
`listOfTuples`
and
`myArray`
based on
`myBooleanArray`
. For
`myArray`
it is straight forward and I can just use:

``````myArray[myBooleanArray]
``````

which gives me the desired output

``````[-2  5]
``````

However, when I use

``````listOfTuples[myBooleanArray]
``````

TypeError: only integer arrays with one element can be converted to an
index

A workaround would be to convert this list to an array first by doing:

``````np.array(listOfTuples)[myBooleanArray]
``````

which yields

``````[[0 1]
[3 1]]
``````

Is there any smarter way of doing this? My desired output would be

``````[(0, 1), (3, 1)]
``````

Already you have done the best way,but if you are looking for a python solution you can use `itertools.compress`

``````>>> from itertools import compress
>>> list(compress(listOfTuples,bool_array))
[(0, 1), (3, 1)]
``````

One of the advantage of `compress` is that it returns a generator and its very efficient if you have huge list. because you'll save much memory with using generators.

And if you want to loop over the result you don't need convert to list. You can just do :

``````for item in compress(listOfTuples,bool_array):
#do stuff
``````
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download