あなたは各配列のランダムなサンプルを取り、それらを組み合わせて、あなたは特定の組み合わせが複数回発生しないことを保証する必要がない場合は特に可能性:
import numpy as np
import random
def random_models(num_values):
n = 5
default = [0.6, 0.67, 2.4e-2, 1e-2, 2e-5, 1.2e-3, 2e-5]
ranges = zip((np.log10(i/10) for i in default),
(np.log10(i*10) for i in default))
data_arrays = []
for lower, upper in ranges:
data_arrays.append(np.logspace(lower, upper, n))
results = []
for i in xrange(num_values):
results.append([random.choice(arr) for arr in data_arrays])
return results
l = random_models(10000)
print len(l)
ここでは繰り返しを避けることができますバージョンですあなたは繰り返すことなく与えることができるよりも多くのデータを要求するまでアップ:
def random_models_avoid_repeats(num_values):
n = 5
default = [0.6, 0.67, 2.4e-2, 1e-2, 2e-5, 1.2e-3, 2e-5]
# Build the range data (tuples of (lower, upper) range)
ranges = zip((np.log10(i/10) for i in default),
(np.log10(i*10) for i in default))
# Create the data arrays to sample from
data_arrays = []
for lower, upper in ranges:
data_arrays.append(np.logspace(lower, upper, n))
sequence_data = []
for entry in itertools.product(*data_arrays):
sequence_data.append(entry)
results = []
# Holds the current choices to choose from. The data will come from
# sequence_data above, but randomly shuffled. Values are popped off the
# end to keep things efficient. It's possible to ask for more data than
# the samples can give without repeats. In that case, we'll reload
# temp_data, randomly shuffle again, and start the process over until we've
# delivered the number of desired results.
temp_data = []
# Build the lists
for i in xrange(num_values):
if len(temp_data) == 0:
temp_data = sequence_data[:]
random.shuffle(temp_data)
results.append(temp_data.pop())
return results
をまた、あなたがyield
を使用して、この発電機作れば、我々は結果リストを構築避けることができることに注意してください。しかし、あなたにもfor
文を使用して結果を消費したいと思います:
def random_models_avoid_repeats_generator(num_values):
n = 5
default = [0.6, 0.67, 2.4e-2, 1e-2, 2e-5, 1.2e-3, 2e-5]
# Build the range data (tuples of (lower, upper) range)
ranges = zip((np.log10(i/10) for i in default),
(np.log10(i*10) for i in default))
# Create the data arrays to sample from
data_arrays = []
for lower, upper in ranges:
data_arrays.append(np.logspace(lower, upper, n))
sequence_data = []
for entry in itertools.product(*data_arrays):
sequence_data.append(entry)
# Holds the current choices to choose from. The data will come from
# sequence_data above, but randomly shuffled. Values are popped off the
# end to keep things efficient. It's possible to ask for more data than
# the samples can give without repeats. In that case, we'll reload
# temp_data, randomly shuffle again, and start the process over until we've
# delivered the number of desired results.
temp_data = []
# Build the lists
for i in xrange(num_values):
if len(temp_data) == 0:
temp_data = sequence_data[:]
random.shuffle(temp_data)
yield temp_data.pop()
あなたはこのようにそれを使用する必要があるだろう:
for entry in random_models_avoid_repeats_generator(10000):
# Do stuff...
または手動でnext()
を使用して、それを反復処理します。
ありがとうございました。特定の組み合わせが複数回発生しないようにする方法はありますか?前もって感謝します。 – DPdl
それはあなたが何をあきらめているかによって決まります。重複がないことを確認しますが、ランダムサンプルを提供するには、リスト全体を生成し、ランダムなサンプルを削除して新しいリストを作成するか、完全な電源を使い果たしたことを知るために、 。あなたはそのような努力のために記憶を使いたいですか?もしそうなら、答えを更新してそれを行うことができます。 – jszakmeister
はい、してください。どうもありがとうございます。 – DPdl