7

これが可能かどうかはわかりませんが、ここに行きます。配列があるとします:

array1 = [0,.1,.2,.3,.4,.5,.6,.7,.8,.9,1]

そして今、array1 からランダムに引き出された 5 つの要素で構成される numpy 1D 配列を作成したいと思います。また、合計が 1 に等しいという条件もあります。例は、のような numpy 配列です[.2,.2,.2,.1,.1]

  • 現在、私はランダム モジュールと次のような選択関数を使用しています。 range1= np.array([choice(array1),choice(array1),choice(array1),choice(array1),choice(array1)]) 次に、range1 をチェックして、基準を満たしているかどうかを確認します。代わりに似たような、より速い方法があるかどうか疑問に思ってい randomArray = np.random.random()ます。

  • この配列を何らかのライブラリに格納できればさらに良いでしょう。そのような配列を 100 個生成しようとすると、繰り返しはありませんが、これは必要ありません。

4

3 に答える 3

2

出力シーケンスの値の順序を気にしない場合、リストの値の合計が 1 になる 5 つの値の組み合わせの数はかなり少ないです。ただし、提案した特定のケースでは、浮動小数点値には丸めの問題があるため、計算が少し複雑です。range(11)一連の整数 (例: ) を使用し、合計が 10 になる組み合わせを見つけると、問題をより簡単に解決できます。次に、小数値が必要な場合は、結果の値を 10 で割るだけです。

とにかく、これは指定された値になるすべての可能なセットを生成するジェネレータです:

def picks(values, n, target):
    if n == 1:
        if target in values:
            yield (target,)
        return
    for i, v in enumerate(values):
        if v <= target:
            for r in picks(values[i:], n-1, target-v):
                yield (v,)+r

0 から 10 までの数字の結果は次のとおりです。

>>> for r in picks(range(11), 5, 10):
    print(r)

(0, 0, 0, 0, 10)
(0, 0, 0, 1, 9)
(0, 0, 0, 2, 8)
(0, 0, 0, 3, 7)
(0, 0, 0, 4, 6)
(0, 0, 0, 5, 5)
(0, 0, 1, 1, 8)
(0, 0, 1, 2, 7)
(0, 0, 1, 3, 6)
(0, 0, 1, 4, 5)
(0, 0, 2, 2, 6)
(0, 0, 2, 3, 5)
(0, 0, 2, 4, 4)
(0, 0, 3, 3, 4)
(0, 1, 1, 1, 7)
(0, 1, 1, 2, 6)
(0, 1, 1, 3, 5)
(0, 1, 1, 4, 4)
(0, 1, 2, 2, 5)
(0, 1, 2, 3, 4)
(0, 1, 3, 3, 3)
(0, 2, 2, 2, 4)
(0, 2, 2, 3, 3)
(1, 1, 1, 1, 6)
(1, 1, 1, 2, 5)
(1, 1, 1, 3, 4)
(1, 1, 2, 2, 4)
(1, 1, 2, 3, 3)
(1, 2, 2, 2, 3)
(2, 2, 2, 2, 2)

それらの 1 つを ( でrandom.choice) ランダムに選択できます。または、それらの多くを使用する予定があり、同じことを繰り返したくない場合は、 を使用してから繰り返すことができますrandom.shuffle

results = list(picks(range(11), 5, 10))
random.shuffle(results)

for r in results:
    # do whatever you want with r
于 2013-09-09T04:48:21.900 に答える