、ここではそのオプションの引数を利用しnp.searchsorted
を持つ別のアプローチがあります - side
left
としてセットとright
-
lidx = np.searchsorted(a,b,'left')
ridx = np.searchsorted(a,b,'right')
mask = lidx != ridx
out = lidx[mask], np.flatnonzero(mask)
# for zipped o/p : zip(lidx[mask], np.flatnonzero(mask))
ランタイムテスト
アプローチ -
def searchsorted_where(a,b): # @Paul Panzer's soln
inds = np.argsort(a)
aso = a[inds]
bina = np.searchsorted(aso[:-1], b)
inds_in_b = np.where(b == aso[bina])[0]
return b[inds_in_b], inds_in_b
def in1d_masking(a,b): # @Psidom's soln
logic = np.in1d(b, a)
return b[logic], np.where(logic)[0]
def searchsorted_twice(a,b): # Proposed in this post
lidx = np.searchsorted(a,b,'left')
ridx = np.searchsorted(a,b,'right')
mask = lidx != ridx
return lidx[mask], np.flatnonzero(mask)
タイミング -
ケース#1(質問からサンプルデータを使用して、それをスケールアップ):なしの場合の#1と同じ
In [2]: a=np.arange(0.,15000.)
...: b=np.arange(4.,15000.,0.5)
...:
In [3]: %timeit searchsorted_where(a,b)
...: %timeit in1d_masking(a,b)
...: %timeit searchsorted_twice(a,b)
...:
1000 loops, best of 3: 721 µs per loop
1000 loops, best of 3: 1.76 ms per loop
1000 loops, best of 3: 1.28 ms per loop
ケース#2(。 a
に比べて比較的小さいb
でelems)の:
In [4]: a=np.arange(0.,15000.)
...: b=np.arange(4.,15000.,5)
...:
In [5]: %timeit searchsorted_where(a,b)
...: %timeit in1d_masking(a,b)
...: %timeit searchsorted_twice(a,b)
...:
10000 loops, best of 3: 77.4 µs per loop
1000 loops, best of 3: 428 µs per loop
10000 loops, best of 3: 128 µs per loop
ケース#3(およびb
で比較的はるかに少ないelems):あなたは私からの最初の2行をカットした場合
In [6]: a=np.arange(0.,15000.)
...: b=np.arange(4.,15000.,10)
...:
In [7]: %timeit searchsorted_where(a,b)
...: %timeit in1d_masking(a,b)
...: %timeit searchsorted_twice(a,b)
...:
10000 loops, best of 3: 42.8 µs per loop
1000 loops, best of 3: 392 µs per loop
10000 loops, best of 3: 71.9 µs per loop
はどうなりますか?彼らは 'a'がソートされていない場合に備えているので、あなたのテスト条件の下で彼らは私が思うはずです;-) –
@divakar Dang!宿題をつけるつもりはありませんでした! :)非常に有用で思いやりのある答えに非常に感謝します。皆さん、お返事いただきありがとうございます。 –
Divakar私は自分自身をチェックしました。当然のことながら、最後の条件では、私の関数は時間の3/4を "argsort"とする(arange(15000))。真ん中の状態ではまだ2/3のままです。だから、可能な限り強力な方法であなたの方法論に抗議しなければならない;-) –