2

乱数の配列があります。たとえば0.07の確率に基づいて、一部の要素のみを変更したいと思います。現在、すべての要素を反復処理するforループを使用してこれを行っています。これを行うためのより良い方法はありますか?

4

2 に答える 2

8

問題の配列が呼び出された場合、aその値の平均比率0.07を次のように選択できます。

a[numpy.random.rand(*a.shape) < 0.07]

これらの値をどのように変更したいかわかりません。それらを2倍するには、

a[numpy.random.rand(*a.shape) < 0.07] *= 2.0
于 2012-07-20T21:09:16.270 に答える
3

スヴェンの答えはエレガントです。ただし、変更する要素を選択する方がはるかに高速です

n = numpy.random.binomial(len(a), 0.07)
a[numpy.random.randint(0, len(a), size=n)] *= 2.0

最初の式は、サンプリングする要素の数を決定し(nは0からlen(a)までの整数ですが、平均0.07)、2番目の式は取得するインデックスの数を正確に生成します。(ただし、同じインデックスを数回取得する場合があることに注意してください。)

との違い

a[numpy.random.rand(len(a)) < p]

pが1に近づくと小さくなりますが、pが小さい場合は、10倍以上になる可能性があります。

于 2014-07-17T08:40:41.193 に答える