cookiedough
cookiedough

Reputation: 3842

Given a value, find percentile % with Numpy

There are probably better words to describe this question, however what I am trying to do is the opposite of np.percentile(). I have a list of n numbers, and I want to see what percentile of them are smaller than a given value. Right now the way I get this value is by continuously trying different decimals. What I want Numpy to tell me is this:

Given threshold = 0.20 (input), about 99.847781% (output) of the items in list d are below this percentile.

What I do right now to get this number is pretty sketchy:

>>> np.percentile(np.absolute(d), 99.847781)
0.19999962082827874

>>> np.percentile(np.absolute(d), 99.8477816)
0.19999989822334402

>>> np.percentile(np.absolute(d), 99.8477817)
0.19999994445584851

>>> np.percentile(np.absolute(d), 99.8477818)
0.19999999068835939
...

Upvotes: 15

Views: 10257

Answers (3)

Robert Robison
Robert Robison

Reputation: 389

The other answers are great. But if there's a chance some values in the array could be identical to the threshold (e.g., array of integers), this trick will handle that:

( (d < threshold).mean() + (d <= threshold).mean() ) / 2

Just averaging using less than and less than or equal to.

Upvotes: 1

Martin Marek
Martin Marek

Reputation: 66

Assuming d is a NumPy array, in general, you can do:

(d < threshold).mean()

And for absolute values specifically:

(np.abs(d) < threshold).mean()

Upvotes: 3

Tim
Tim

Reputation: 2843

If I'm understanding your question correctly, something like

sum(d < threshold) / len(d)

should do it.

Edit: I missed the absolute value in the question -

sum(np.abs(d) < threshold) / float(len(d))

Upvotes: 18

Related Questions