# [Numpy-discussion] how to do this efficiently?

Zachary Pincus zachary.pincus at yale.edu
Wed Feb 9 11:04:24 EST 2011

```On Feb 9, 2011, at 10:58 AM, Neal Becker wrote:

> Zachary Pincus wrote:
>
>>>>> In a 1-d array, find the first point where all subsequent points
>>>>> have values
>>>>> less than a threshold, T.
>>>>
>>>> Maybe something like:
>>>>
>>>> last_greater = numpy.arange(arr.shape)[arr >= T][-1]
>>>> first_lower = last_greater + 1
>>>>
>>>> There's probably a better way to do it, without the arange,
>>>> though...
>>>
>>> I'm trying to find the first point in a power spectrum such that all
>>> subsequent
>>> points are below some level.  I've started with:
>>>
>>> db is my power spectrum in dB,   It is already reversed.
>>>
>>> mag = np.maximum.accumulate (db) - db[-1]
>>>
>>> Now all I need is to find the first point such that mag < -50.  How
>>> to do this
>>> efficiently?
>>
>> Right -- that's what I showed above. Find the last point in mag that
>> is >= -50, and by definition the next point is the first point such
>> that the remainder of mag is < -50.
>
> But where is numpy's 'find_first' function?  I can't seem to find it
> make my own in C++.

As before, the line below does what you said you need, though not
maximally efficiently. (Try it in an interpreter...) There may be
another way in numpy that doesn't rely on constructing the index
array, but this is the first thing that came to mind.

last_greater = numpy.arange(arr.shape)[arr >= T][-1]

Let's unpack that dense line a bit:

indices = numpy.arange(arr.shape)
last_above_threshold_index = above_threshold_indices[-1]

Does this make sense?

```