Reputation: 3842
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
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
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
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