0

次の問題: 基本トリプル (0,1,0) を持つ

ここで、特定の範囲で変更されたトリプルのリストを作成しようとしています。

制約:

  1. triple[0] と triple[2] には、r=0.2 のように最大 r が必要です。
  2. 合計(トリプル)= 1
  3. triple[0] は triple[1] と等しい必要はなく、s= 0.02 などの特定の段階的パラメーター s だけ増加させる必要があります

この上記の例では、メソッドが作成する必要があります

lst = [(0.0, 1, 0.0),(0.02, 0.98, 0.), (0.04, 0.96,0), (0.04,0.94, 0.02), (0.06,0.94,0), (0.06, 0.92, 0.02), (0.06, 0.9, 0.04), ...]

これを行うためのきれいな方法はありますか?

ネストされたループなしでこれらのリストを作成するという考えがあるかもしれません (おそらく numpy を使用しますか?)。

どうもありがとう!

4

4 に答える 4

1

あなたが説明するようにトリプルを作る関数を作成することができます...次のようなもの:

def make_triple(r=0.2, s=0.02):
    element_one = round(random.uniform(0, r), 2)
    max_s = r/s
    element_three = random.randint(0, max_s) * s
    element_two = round(1 - element_one - element_three, 2)
    return (element_one, element_two, element_three)

次に、この関数を呼び出す単一のループを作成します。

list_of_triples = []
for i in range(5):
    list_of_triples.append(make_triple(0.2, 0.02))

そして、あなたは行き​​ます!ネストされたループは必要ありません。

于 2012-05-23T17:32:40.497 に答える
1

キックのためだけの別の派手な答え:

import numpy as np
r = .2
s = .02

a, b = np.mgrid[0:r:s, 0:r:s]
lst = np.dstack([a, 1 - (a+b), b]).reshape(-1, 3)
于 2012-05-23T19:07:46.193 に答える
1

これは、制約を満たすすべての 3 タプルを提供するリスト内包表記です (私が理解しているとおり)。範囲関数は整数のみを受け入れるため、私が望むよりも少し不格好です:

r = 0.2
s = 0.02
steps = int(math.ceil(r/s))
lst = [(a*s, 1-(a+b)*s, b*s) for b in range(steps) for a in range(steps)]

結果:

>>> lst[0:4]
[(0.0, 1.0, 0.0), (0.02, 0.98, 0.0), (0.04, 0.96, 0.0), (0.06, 0.94, 0.0)]
>>> lst[90:94]
[(0.0, 0.8200000000000001, 0.18), (0.02, 0.8, 0.18), (0.04, 0.78, 0.18), (0.06, 0.76, 0.18)]

このコードでは、最初と最後の値は 0.18 までしかありません。それが望ましいかどうかはわかりません (制約は < r または <= r ですか?)。他の方法が必要な場合でも、微調整するのはそれほど難しくありません。

于 2012-05-23T17:52:30.073 に答える
0

要求に応じて、for ループのない NumPy ソリューションを次に示します。3D 配列と NumPy ブロードキャスト ルールを使用して、行ごとおよび列ごとにスケールを割り当てます。scaleは 1 列の 2D 配列なので、 で簡単に転置できます.T。最終的に、3D 配列は 2D に再形成されます。

import numpy as np

r = .2
s = .02

scale = np.arange(r, step=s, dtype=float).reshape(-1,1)
a = np.empty((len(scale),len(scale),3), dtype=float)
a[:,:,0] = scale
a[:,:,2] = scale.T
a[:,:,1] = 1 - a[:,:,0] - a[:,:,2]

print a.reshape(-1,3)
于 2012-05-23T18:04:43.653 に答える