yar
の作成を避けるように最適化することができます。線形指標をnp.random.choice
から取得し、np.unravel_index
と次元インデックスに変換すると、x
とy
となります。
ので、実装は次のようになり -
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%
を食べていました。
ワイトドランダムについて[Raymond Hettinger tweet](https://twitter.com/raymondh/status/748586729716719617)をチェックしてください。役立つかもしれません –