I have vectorized an array values of test values, whose locations I would like to find in an array of bins. numpy allows for this using np.digitize or np.searchsorted:
import numpy as np
values=np.arange(-5.1,20.9,0.5)
bins=np.arange(10)
indices=np.digitize(values,bins)
indices2=np.searchsorted(bins,values)
assert((indices==indices2).all()), 'NB np.digitize and np.searchsorted argument orders are reversed'
It seems obvious, but I now wish to use my nice shiny vector array indices, but the following throws an IndexError because np.digitize and np.searchsorted (helpfully) set out-of-bounds inputs to 0 or len(bins):
print bins[indices] # -> IndexError
Since the whole point was to keep everything vectorized, what is the best way to trap the IndexError without a for-loop and hence assign the output of bins[indices] to another array for onward calculation? (A clip value is available on request :) )
Should I use a custom mapping function or lambda? (along the lines of How to make scipy.interpolate give an extrapolated result beyond the input range? - except I don't want to interpolate an exact array)
Thanks as ever for all help
Update:
I could actually - in my case - achieve the desired onward behaviour with:
indices[indices==len(bins)]=len(bins)-1
print bins[indices]
But this does lose some information* and the most general, best-practice route - which is what I am after - is not clear to me.
*That's because I would no longer be able to distinguish between acceptable indices and those that were out-of-bounds.