25

Is it possible to modify the numpy.random.choice function in order to make it return the index of the chosen element? Basically, I want to create a list and select elements randomly without replacement

import numpy as np
>>> a = [1,4,1,3,3,2,1,4]
>>> np.random.choice(a)
>>> 4
>>> a
>>> [1,4,1,3,3,2,1,4]

a.remove(np.random.choice(a)) will remove the first element of the list with that value it encounters (a[1] in the example above), which may not be the chosen element (eg, a[7]).

4

8 に答える 8

13

最初の質問に関しては、逆の方法で作業し、配列のインデックスからランダムに選択してからa値を取得できます。

>>> a = [1,4,1,3,3,2,1,4]
>>> a = np.array(a)
>>> random.choice(arange(a.size))
6
>>> a[6]

しかし、置換なしのランダムサンプルだけが必要な場合は、十分replace=Falseです。最初に に追加されたのはいつだったか思い出せrandom.choiceません。1.7.0 かもしれません。したがって、非常に古いnumpyものを実行している場合は、機能しない場合があります。デフォルトはreplace=True

于 2013-09-13T20:24:26.110 に答える
9
numpy.random.choice(a, size=however_many, replace=False)

差し替えなしのサンプルが必要な場合は、numpy に作成を依頼してください。アイテムを繰り返しループして描画しないでください。これにより、肥大化したコードと恐ろしいパフォーマンスが生成されます。

例:

>>> a = numpy.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> numpy.random.choice(a, size=5, replace=False)
array([7, 5, 8, 6, 2])

十分に最近の NumPy (少なくとも 1.17) では、新しい乱数 API を使用する必要があります。これにより、古い API のreplace=Falseコード パスがフードの下で入力の完全な順列を不必要に生成する長年のパフォーマンスの問題が修正されます。

rng = numpy.random.default_rng()
result = rng.choice(a, size=however_many, replace=False)
于 2013-09-13T20:08:53.400 に答える
1

を使用する代わりにchoice、単にrandom.shuffle配列を使用することもできます。

random.shuffle(a)  # will shuffle a in-place
于 2016-12-02T13:40:21.577 に答える