2017-08-24 4 views
4

私は2dのnumpy配列Zを持っています。インデックスを選択する確率は、そのインデックスのZの値に比例するZのインデックスをランダムに選択したいと思います。2dのnumpy配列からの加重ランダムサンプリング

は今のところ、私は次のことをやっている:

仕事をしていませんが、恐ろしい感じている(しかも非常に遅い)
yar = list(np.ndenumerate(Z)) 
x,y = yar[np.random.choice(len(yar), p=Z.ravel()/Z.sum())][0] 

。より良い方法がありますか?

+1

ワイトドランダムについて[Raymond Hettinger tweet](https://twitter.com/raymondh/status/748586729716719617)をチェックしてください。役立つかもしれません –

答えて

2

yarの作成を避けるように最適化することができます。線形指標をnp.random.choiceから取得し、np.unravel_indexと次元インデックスに変換すると、xyとなります。

ので、実装は次のようになり -

linear_idx = np.random.choice(Z.size, p=Z.ravel()/float(Z.sum())) 
x, y = np.unravel_index(linear_idx, Z.shape) 

だけyarの作成はその設定でボトルネックの原因となったことにより、数字上のいくつかのコンテキストを与えるために、ここではサンプルタイミングテストです -

In [402]: Z = np.random.randint(0,9,(300,400)) 

In [403]: yar = list(np.ndenumerate(Z)) 

In [404]: %timeit list(np.ndenumerate(Z)) 
10 loops, best of 3: 46.3 ms per loop 

In [405]: %timeit yar[np.random.choice(len(yar), p=Z.ravel()/float(Z.sum()))][0] 
1000 loops, best of 3: 1.34 ms per loop 

In [406]: 46.3/(46.3+1.34) 
Out[406]: 0.971872376154492 

yarを作成すると、が実行時の97%を食べていました。

関連する問題