user344226 - 29 days ago 8

Python Question

In MATLAB it is easy to find the indices of values that meet a particular condition:

`>> a = [1,2,3,1,2,3,1,2,3];`

>> find(a > 2) % find the indecies where this condition is true

[3, 6, 9] % (MATLAB uses 1-based indexing)

>> a(find(a > 2)) % get the values at those locations

[3, 3, 3]

What would be the best way to do this in Python?

So far, I have come up with the following. To just get the values:

`>>> a = [1,2,3,1,2,3,1,2,3]`

>>> [val for val in a if val > 2]

[3, 3, 3]

But if I want the index of each of those values it's a bit more complicated:

`>>> a = [1,2,3,1,2,3,1,2,3]`

>>> inds = [i for (i, val) in enumerate(a) if val > 2]

>>> inds

[2, 5, 8]

>>> [val for (i, val) in enumerate(a) if i in inds]

[3, 3, 3]

Is there a better way to do this in Python, especially for arbitrary conditions (not just 'val > 2')?

I found functions equivalent to MATLAB 'find' in NumPy but I currently do not have access to those libraries.

Answer Source

You can make a function that takes a callable parameter which will be used in the condition part of your list comprehension. Then you can use a lambda or other function object to pass your arbitrary condition:

```
def indices(a, func):
return [i for (i, val) in enumerate(a) if func(val)]
a = [1, 2, 3, 1, 2, 3, 1, 2, 3]
inds = indices(a, lambda x: x > 2)
>>> inds
[2, 5, 8]
```

It's a little closer to your Matlab example, without having to load up all of numpy.