2017-08-17 16 views
-2

ブール値を持つ1D(numpy)配列を持っています。配列の特定の要素からランダム要素を選択します。

x = [True, True, False, False, False, True, False, True, True, True, False, True, True, False] 

アレイには、8のTrue値が含まれています。私は正確に3(この場合は8より小さくてはならない)を、実際に存在する8から真の値として保持したいと考えています。言い換えれば、これらの8の値のうち5をFalseにランダムに設定したいとします。

可能結果が指定できます

x = [True, True, False, False, False, False, False, False, False, False, False, False, True, False] 

それを実装する方法は?

+1

これまでに問題を解決するために何をしましたか?難易度はどこですか?これを実装しようとしたコードを私たちに示してもらえますか? – Derek

+0

正確に何がランダムであるべきですか?要素の数(あなたの場合3)または新しい配列内の位置?またはあなたの配列 'x'からどの要素を選ぶか? – MSeifert

答えて

4

一つのアプローチは次のようになります -

# Get the indices of True values 
idx = np.flatnonzero(x) 

# Get unique indices of length 3 less than the number of indices and 
# set those in x as False 
x[np.random.choice(idx, len(idx)-3, replace=0)] = 0 

サンプル実行 -

# Input array 
In [79]: x 
Out[79]: 
array([ True, True, False, False, False, True, False, True, True, 
     True, False, True, True, False], dtype=bool) 

# Get indices 
In [80]: idx = np.flatnonzero(x) 

# Set 3 minus number of True indices as False 
In [81]: x[np.random.choice(idx, len(idx)-3, replace=0)] = 0 

# Verify output to have exactly three True values 
In [82]: x 
Out[82]: 
array([ True, False, False, False, False, False, False, True, False, 
     False, False, True, False, False], dtype=bool) 
+0

@Divakarあなたは私のことを完全に理解しました、ありがとう! – pyigal

+0

はい、それは意味があります。それが受け入れられたことを考えると、私は疑問を誤解しているに違いない。今すぐコメントを削除する:) – MSeifert

0

そしてちょうど

import random 
def buildRandomArray(size, numberOfTrues): 
    res = [False]*(size-numberOfTrues) + [True]*numberOfTrues 
    random.shuffle(res) 
    return res 

Live exampleてシャッフル、希望TrueFalseの数と配列を構築します

関連する問題