2017-06-08 16 views
0

elementsで各要素の選択を試みています。次に、elementsの要素の優先順位(1,2,3)の要素をペアにしています。選択は要素の確率(weights)に関してほとんど行われます。ここまでのコード:リストから1つ以上の要素を選択する

from numpy.random import choice 
elements = ['one', 'two', 'three'] 
weights = [0.2, 0.3, 0.5] 
chosenones= [] 
for el in elements: 
    chosenones.append(choice(elements,p=weights)) 
tuples = list(zip(elements,chosenones)) 

収量:

[('one', 'two'), ('two', 'two'), ('three', 'two')] 

私は必要なものは、の選択肢の代わりに、1を作るために、各要素のために、です。

予想される出力は次のようになります。あなたはこの出力を持って行う方法を知っています

[('one', 'two'), ('one', 'one'), ('two', 'two'),('two', 'three'), ('three', 'two'), ('three', 'one')] 

+0

これらの2つの選択肢が、それらが異なるかしなければならない重複が許可されていますか?例えば。 '(' one '、' one ')、(' one '、' one ') 'は出力結果の有効シーケンスですか? –

+0

これは標準ライブラリでランダムを使うべきです、あなたは本当にnumpyバージョンを使用していません。 –

+0

@MartijnPieters重複は許されますが、重複がない場合はより良いでしょう。しかし、間違いなく許可されました – bapors

答えて

1

、ちょうど2つの値を選択するnumpy.random.choice()を伝えます。

tuples = [] 
for el in elements: 
    for chosen in choice(elements, size=2, replace=False, p=weights): 
     tuples.append((el, chosen)) 

やリストの内包表記を使用して:あなたのループ(zip()を使用する必要はありません)としてタプルとしてel値が含まreplace=Falseを設定することにより

tuples = [(el, chosen) for el in elements 
      for chosen in choice(elements, size=2, replace=False, p=weights)] 

を、あなたは一意の値を取得します。それを削除するか、反復を可能にするために明示的にTrueに設定してください。オプションのintまたはintのタプル、
出力形状:

サイズnumpy.random.choice() documentationを参照してください。所与の形状が例えば(m, n, k)である場合、m * n * k個のサンプルが描画される。デフォルトはNoneで、その場合は単一の値が返されます。

置き換える:
オプションブール値を、サンプルがデモ

または交換なしであるかどうか:

>>> from numpy.random import choice 
>>> elements = ['one', 'two', 'three'] 
>>> weights = [0.2, 0.3, 0.5] 
>>> tuples = [] 
>>> for el in elements: 
...  for chosen in choice(elements, size=2, replace=False, p=weights): 
...   tuples.append((el, chosen)) 
... 
>>> tuples 
[('one', 'three'), ('one', 'one'), ('two', 'three'), ('two', 'two'), ('three', 'three'), ('three', 'two')] 
>>> [(el, chosen) for el in elements for chosen in choice(elements, size=2, replace=False, p=weights)] 
[('one', 'one'), ('one', 'three'), ('two', 'one'), ('two', 'three'), ('three', 'two'), ('three', 'three')] 
+0

ありがとう!それでおしまい! – bapors

1

あなたは重複を受け入れる場合は、random.choicesは仕事をする:

random.choicesの(人口、重み=なし、*、cum_weights =なし、K = 1)

戻るAKサイズのリスト集団から選択された要素を置換する。母集団が空の場合、IndexErrorが発生します。

ウェイトシーケンスが指定されている場合、相対ウェイトに従って選択が行われます。あなたは2を必要とする場合

>>> random.choices(['one', 'two', 'three'], weights=[0.2, 0.3, 0.5], k=2) 
['one', 'three'] 
+0

@jonrsharpe:それは重み付けされています。 'random.choices()'複数は 'random.choice()'単数ではありません。これは繰り返し値を許します( 'numpy.random.choice()'関数の 'replace = True')。 –

+0

@MartijnPieters私はそれがランダムだったコメントを書いた。サンプル... – jonrsharpe

+0

@jonrsharpeええ、それについて申し訳ありません、私は少し速く私の最初の答えを書いた... –

関連する問題