Hi all,
I added the keyword side to the searchsorted method and functions.
Documentation:
"""a.searchsorted(values=v, side='left') -> array of indices.
Required Arguments:
v -- keys to be searched for in a.
Keyword arguments
side -- {'left', 'right'}, default('left').
If a is a 1-D array in ascending order, then
a.searchsorted(v, side='left')
returns an array of indices i such that for each element of values the
following holds:
a[j] < key <= a[i] for all j < i,
If such an index does not exist, a.size() is used. The result is such
that
if the key were to be inserted in the slot before the index i, then the
order of a would be preserved and i would be the smallest index with
that
property.
If a is a 1-D array in ascending order, then
a.searchsorted(v, side='right')
returns an array of indices i such that for each element of values the
following holds:
a[j] <= key < a[i] for all j < i,
If such an index does not exist, a.size() is used. The result is that if
the
key were to be inserted in the slot before the index i, then the order
of a
would be preserved and i would be the largest index with that property.
"""
I also replaced the old search routine as it was linear time worst case:
In [27]: t1 = t.Timer('N.searchsorted(a,1,side="left")','import numpy as N;
a = N.ones(1000000)')
In [28]: t2 = t.Timer('N.searchsorted(a,1,side="right")','import numpy as N;
a = N.ones(1000000)')
In [29]: t1.repeat(3,100)
Out[29]: [0.5301368236541748, 0.4924161434173584, 0.46317386627197266]
In [30]: t2.repeat(3,100)
Out[30]: [0.0011379718780517578, 0.00081586837768554688,
0.00083994865417480469]
where left was the original routine. It is now noticeably faster in some
situations:
In [2]: t1 = t.Timer('N.searchsorted(a,1,side="left")','import numpy as N; a
= N.ones(1000000)')
In [3]: t1.repeat(3,100)
Out[3]: [0.00082802772521972656, 0.00077795982360839844,
0.00076913833618164062]
I am open to suggestions as to better names for the keyword kind. It also
might be worth it to make type-specific routines if anyone commonly uses
large lists of keys and large sorted arrays.
Chuck