2016-09-01 14 views
-1

http://docs.scipy.org/doc/numpy-dev/reference/generated/numpy.random.choice.htmlによれば、replace = FalseをNumpyのrandom.choiceメソッドで使用すると、置換なしでサンプルが作成されます。しかし、これは私のために動作していないよう:Numpyのrandom.choiceを使用してリストから項目をランダムに削除する

In [33]: import numpy as np 

In [34]: arr = range(5) 

In [35]: number = np.random.choice(arr, replace = False) 

In [36]: arr 
Out[36]: [0, 1, 2, 3, 4] 

配列arrはまだサンプリング後range(5)ある、と私は期待通り(ランダム)番号が欠落していません。交換なしでrange(5)から番号をサンプリングするにはどうすればよいですか?

+1

'。文字通り配列からサンプリングするのではありません。 –

+2

これを 'arr'に戻すことはありません。 – Divakar

+0

@Divakarこれは、OPが探しているものを補完するものです。 –

答えて

4

コメントの1つで説明したように、np.choiceは、置換の有無にかかわらず、シーケンスの一連の数値を選択します。しかし、シーケンスは変更されません。

簡単に代替

arr = range(5) 
# numbers below will never contain repeated numbers (replace=False) 
numbers = np.random.choice(arr, 3, replace=False) 

私はあなたがなりたいと思う行動:

arr = range(5) 
all_but_one = np.random.choice(arr, len(arr) -1, replace=False) 

ので、あなたは(繰り返しを避けるために)交換することなく、N-1の番号を選択することになり、効果的に取り除きますイテラブルからのランダム要素。元の配列を変異ないnp.random.choice`

より効率的な代替

arr = range(5) 
random_index = np.random.randint(0, len(arr)) 
arr.pop(random_index) 
0

私はrandomライブラリを使用して関数を定義することになった:

import random 
def sample_without_replacement(arr): 
    random.shuffle(arr) 
    return arr.pop() 

その使用は以下の通りである:この方法はまた、代わりに、私の目的のために、配列をシャッフルすることを

In [51]: arr = range(5) 

In [52]: number = sample_without_replacement(arr) 

In [53]: number 
Out[53]: 4 

In [54]: arr 
Out[54]: [2, 0, 1, 3] 

は注意それは問題ではない。

関連する問題