2017-01-12 8 views
-3
def models(): 
    default = [0.6,0.67,2.4e-2,1e-2,2e-5,1.2e-3,2e-5] 
    lower = [np.log10(i/10) for i in default] 
    upper = [np.log10(i*10) for i in default] 
    n = 5 
    a = np.logspace(lower[0],upper[0],n) 
    b = np.logspace(lower[1],upper[1],n) 
    c = np.logspace(lower[2],upper[2],n) 
    d = np.logspace(lower[3],upper[3],n) 
    e = np.logspace(lower[4],upper[4],n) 
    f = np.logspace(lower[5],upper[5],n) 
    g = np.logspace(lower[6],upper[6],n) 

    combs = itertools.product(a,b,c,d,e,f,g) 

    list1 = [] 

    for x in combs: 
     x = list(x) 
     list1.append(x) 


    return list1 

上記のコードは5^7 = 78,125のリストを返します。 a、b、c、d、e、f、gのアイテムを無作為に組み合わせて、10000というリストのリストを作成する方法はありますか?複数のリストからランダムにn個の組み合わせを作成する

答えて

1

あなたは各配列のランダムなサンプルを取り、それらを組み合わせて、あなたは特定の組み合わせが複数回発生しないことを保証する必要がない場合は特に可能性:

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()を使用して、それを反復処理します。

+0

ありがとうございました。特定の組み合わせが複数回発生しないようにする方法はありますか?前もって感謝します。 – DPdl

+1

それはあなたが何をあきらめているかによって決まります。重複がないことを確認しますが、ランダムサンプルを提供するには、リスト全体を生成し、ランダムなサンプルを削除して新しいリストを作成するか、完全な電源を使い果たしたことを知るために、 。あなたはそのような努力のために記憶を使いたいですか?もしそうなら、答えを更新してそれを行うことができます。 – jszakmeister

+0

はい、してください。どうもありがとうございます。 – DPdl

関連する問題