web-dev-qa-db-ja.com

numpy.random.choiceのインデックスを取得する方法? -python

選択した要素のインデックスを返すようにnumpy.random.choice関数を変更することは可能ですか?基本的に、リストを作成し、置換せずにランダムに要素を選択します

_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))は、リストの最初の要素を検出した値(上記の例では_a[1]_)で削除します。これは、選択した要素ではない可能性があります(例:_a[7]_)。

18
HappyPy

以下は、ランダムに選択された要素のindexを見つける1つの方法です。

import random # plain random module, not numpy's
random.choice(list(enumerate(a)))[0]
=> 4      # just an example, index is 4

または、要素andインデックスを単一のステップで取得できます。

random.choice(list(enumerate(a)))
=> (1, 4) # just an example, index is 1 and element is 4
11
Óscar López

最初の質問に関しては、逆の方法で配列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であることに注意してください

7
CT Zhu
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])
7
user2357112

これは他の回答と比較すると左のフィールドに少しありますが、少し広い意味であなたがやろうとしているように聞こえることを助けるかもしれないと思いました。ソース配列の要素のインデックスをシャッフルすることにより、置換なしでランダムなサンプルを生成できます。

source = np.random.randint(0, 100, size=100) # generate a set to sample from
idx = np.arange(len(source))
np.random.shuffle(idx)
subsample = source[idx[:10]]

これは、ソースセット(ここではサイズ100)から要素を置き換えずに描画してサンプル(ここではサイズ10)を作成します。

残りのインデックス値を使用して、選択されていない要素を操作できます。

notsampled = source[idx[10:]]
4
lmjohns3

choiceを使用する代わりに、単純に random.shuffle あなたの配列、つまり.

random.shuffle(a)  # will shuffle a in-place
1
Tobias Kienzler

これは簡単な解決策です。範囲関数から選択してください。

import numpy as np
a = [100,400,100,300,300,200,100,400]
I=np.random.choice(np.arange(len(a)))
print('index is '+str(I)+' number is '+str(a[I]))
0
Shaaban

あなたのコメントに基づいて:

サンプルはすでにaです。 aを直接操作して、残っている要素の数を制御し、aを使用して他の操作を実行できるようにします。 – HappyPy

aランダムに選択された要素が削除された後、nでの作業に興味があるように思えます。代わりに、aからランダムに選択されたN = len(a) - n要素を処理しないのはなぜですか?それらを元の順序のままにしたいので、@ CTZhuの回答のようにインデックスから選択できますが、それらを並べ替えて元のリストから取得できます。

import numpy as np
n = 3 #number to 'remove'
a = np.array([1,4,1,3,3,2,1,4])
i = np.random.choice(np.arange(a.size), a.size-n, replace=False)
i.sort()
a[i]
#array([1, 4, 1, 3, 1])

これで、再びaとして保存できます。

a = a[i]

a要素を削除してnを操作します。

0
askewchan

多分遅いですが、私がそうするための最も簡単な方法は次のとおりだと思うので、この解決策に言及することは価値があります:

a = [1,4,1,3,3,2,1,4]
n = len(a)
idx = np.random.choice(list(range(n)), p=np.ones(n)/n)

それはあなたがインデックスから選択するであることを意味します。より一般的なケースでは、次の方法で加重サンプリング(およびインデックスを返す)を実行できます。

probs = [.3, .4, .2, 0, .1]
n = len(a)
idx = np.random.choice(list(range(n)), p=probs)

何度もそうしようとすると(たとえば1e5)、選択されたインデックスのヒストグラムは[0.30126 0.39817 0.19986 0. 0.10071]この場合は正しいです。

とにかく、インデックスから選択し、(必要に応じて)値を確率として使用する必要があります。

0
Mehdi1902