選択した要素のインデックスを返すように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]
_)。
以下は、ランダムに選択された要素の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
最初の質問に関しては、逆の方法で配列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
であることに注意してください
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])
これは他の回答と比較すると左のフィールドに少しありますが、少し広い意味であなたがやろうとしているように聞こえることを助けるかもしれないと思いました。ソース配列の要素のインデックスをシャッフルすることにより、置換なしでランダムなサンプルを生成できます。
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:]]
choice
を使用する代わりに、単純に random.shuffle
あなたの配列、つまり.
random.shuffle(a) # will shuffle a in-place
これは簡単な解決策です。範囲関数から選択してください。
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]))
あなたのコメントに基づいて:
サンプルはすでに
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
を操作します。
多分遅いですが、私がそうするための最も簡単な方法は次のとおりだと思うので、この解決策に言及することは価値があります:
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]
この場合は正しいです。
とにかく、インデックスから選択し、(必要に応じて)値を確率として使用する必要があります。