2017-06-09 11 views
-1

確率リストを作成しようとしていますが、これは新しい要素が結合されるたびに更新する必要があります。私のコードは次のとおりです。リストの内容が常に1になるようにする方法を教えてください。

>>prob_list 
[0.2857142857142857, 0.2857142857142857, 0.2857142857142857, 0.14285714285714285] 

をそして、私はprob_listの要素の和をチェックするとき、それは完全に1まで合計:得

sum=7 
my_list = [2,2,2,1] 
prob_list = list(map(lambda x: float(x/sum), my_list)) 

0,2857142857142857+ 0,2857142857142857+ 0,2857142857142857+0,14285714285714285 = 1 

しかし、 numpy.random.choiceでこのファイルを使用すると、確率が1にならないというエラーが発生します。

k = choice(my_list, size=1,replace=False, p=prob_list)[0] 

誤差である:=選択(my_listという、サイズ= 1、偽=置き換え、P = prob_list)

K [0](mtrand.RandomState.choiceに、 "mtrand.pyx"、ライン1130ファイルnumpyの/ランダム/ mtrand/mtrand.c:17766)

とValueError:確率は1

に合計していないあなたは、エラーの理由を知っていますし、どのように私はそれを修正することができますか?

+2

私にとってはうまく動作します。あなたのNumPy/Pythonバージョンは何ですか? – MSeifert

+0

また、 'sum'は組み込み関数なので、別の変数名を選ぶほうが良いので、組み込みの' sum'をシャドーしません。 – MSeifert

+0

あなたはどこでも同じPythonバージョンを使用していますか? 2と3は互換性がありません。 – user2357112

答えて

0

すべての証拠に、この関数のnumpy実装が壊れていることが示されています。これは浮動小数点数の丸めによってほぼ確実に起こります。浮動小数点数の切り捨ては、複数の浮動小数点数を一緒に追加し、それが整数(整数)になるといつでも発生する可能性があります。トレースバックは、関数自体がC言語で書かれていることを示しています。おそらく、CからPythonへの変換は、丸め誤差が累積する別の方法を紹介します。

import random 

def choice(x): 
    r = random.randrange(sum(x)) 
    for a in x: 
     r -= a 
     if r < 0: 
      return a 

my_list = [11, 4, 2, 2, 1] 

for _ in range(10): 
    print(choice(my_list)) 

このルーチンを使用すると、int型のリストを提供していることを前提とし、全てのフロート演算を回避:ソリューションは、このように、numpyのを忘れて、Pythonで関数を記述することです。

私はなぜこの問題が解決されたのか分かりません。私にとっては良い質問のようです。

+0

他はエラーを複製できませんので、株式numpyでは問題ありません。 – hpaulj

+0

正確に1.000000000に集計された浮動小数点のリストを提供する必要がある場合は、どのバージョンのnumpyでも問題になる可能性があります。これは簡単なことではなく、一部のリストでは動作しますが、他のリストでは動作しません。マシンに依存することさえあります。 OPはそれが[0.2,0.2,0.2,0.4]で動作すると言います。私は関数が単純なので、問題全体をバイパスし、intを直接使用する方がよいと主張しています。そして、私はすでにそれを持っていた:-) –

+0

@PaulCorneliusあなたの返信ありがとう!これは非常に良い解決策のようですが、私は 'my_list'から数値を考慮しなければなりません。ここで 'choice()'関数はランダムな選択をしますか? – bapors

関連する問題