2017-06-06 9 views
2

私はPythonシミュレーションで実験を行っており、入力ケースのリストを作成する必要があります。Pythonでデフォルト値を持つ複数リストの反復

各ケースは、例えば、パラメータのリストのリストから取られたインスタンスである:

heights = [100,110,120] 
alphas = [0.1,0.01,0.001] 
C = [0.1,0.2,0.5,0.9] 
B = [1,2] 

及びリストのリストである:

params = [heights,alphas,C,B] 

元の量が大きい(〜30x100 )ので、各リストを直接扱うのは効率的ではありません。

最終的には、各入力の場合は、例えば、各カテゴリから一つのパラメータのタプル/ namedtuple /辞書です:

instance = {'height':100, 'alpha':0.1,'C:0.1, 'B':1} 

私はインスタンスのリストを作成するために、パラメータ空間を反復したいと思います - しかし、

の代わりにそれらのすべての直積を作り、各パラメータごとカテゴリの残りはデフォルト値に設定されている間、私は、すべてのオプションを反復処理したい(最初の):ここでキャッチはです。例えば:

params = [[1,2,3],[4,5][7,8]] 

(無反復で)インスタンスの予想セットである:

[(1,4,7)、(2,4,7)、(3,4、 7)、(1,5,7-)(1,4,8)]

は、最初のインデックスのデフォルトであり、第2のインデックスとでのデフォルトであります第3のデフォルト。デカルト積を作る

itertoolsと非常に簡単である:

from itertools import product 
params = [[1,2,3],[4,5],[7,8]] 
list(product(*params)) 

[(1、4、7)、(1,4,8)、(1,5,7)、(1 (2,4,7)、(2,4,7)、(2,5,8)、(2,5,8)、(3,4,7)、(3,4,5)、 (3,5,7)、(3,5,7)、(3,5,8)]

この場合、不要なインスタンスは除外できますが、最初の場所で生成するのは不十分です。この繰り返しを構築するためのエレガントな方法はありますか?

答えて

1
params = [[1, 2, 3], [4, 5], [7, 8]] 
default = [par[0] for par in params] 
instances = set() 

for ii, pp in enumerate(params): 
    for value in pp: 
     new_instance = default[:ii] + [value] + default[ii + 1:] 
     instances.add(tuple(new_instance)) 
1

私は別のアプローチを提案します。 openTURNSを使用してください。このPythonライブラリはよく開発されており、空間充填の面で優れた特性を持つとされる実験の設計を定義するためのクラスがいくつかあります。

LowDiscrepancySequenceを参照してください。このデザインを使用すると、統計分析やモデル作成などができます。私はそれらとは関係がありませんが、フィールドではよく知られています。

しかし、あなたはあなたの方法に固執することができます。

((I、J、K)の製品ではI、J、K(...)のための)

:それはより多くのニシキヘビ私はそのために直接ジェネレータ式またはリストの内包表記を建設するようにするには
0

注意最終リスト内の各タプルの2番目と3番目のインスタンスは、唯一の2初期アレイ

a, *b = params 
# a = [1, 2, 3] 
# b = [[4, 5], [7, 8]] 

の第3行からの製品は内のすべての要素のうちの製品を作ることですb

import itertools 

b = [x for x in itertools.product(*b)] 
# b = [(4, 7), (4, 8), (5, 7), (5, 8)] 

は今全体的に短くB

c = [(a, b, c) for a, (b, c) in itertools.product(a, b)] 

# c = [(1, 4, 7), (1, 4, 8), (1, 5, 7), (1, 5, 8), (2, 4, 7), (2, 4, 8), (2, 5, 7), (2, 5, 8), (3, 4, 7), (3, 4, 8), (3, 5, 7), (3, 5, 8)] 

のすべての値との積を実行します。

import itertools 

params = [[1,2,3], 
      [4,5], 
      [7,8]] 

a, *b = params 
f = itertools.product 

c = [(a, b ,c) for a, (b, c) in f(a, f(*b))] 
+0

は、それはまだ最初のすべてのインスタンスを作成し、フィルタではありません彼らは? – Dimgold

+1

あなたが書いた最後のボックスを見て、それがあなたの希望する出力であると思っていました。 – Rosh

関連する問題