[Numpy-discussion] how to do this efficiently?

Neal Becker ndbecker2 at gmail.com
Wed Feb 9 11:48:25 EST 2011


Zachary Pincus wrote:

> 
> 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
>> so I had to
>> 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:
> 
> mask = arr >= T
> indices = numpy.arange(arr.shape)
> above_threshold_indices = indices[mask]
> last_above_threshold_index = above_threshold_indices[-1]
> 
> Does this make sense?

Yes, thanks for the explanation.

Still, I wonder if numpy would benefit from a 'find_first' function.




More information about the NumPy-Discussion mailing list