2016-10-20 7 views
1

OKを生成するためにそれを適用し、私はタイトルにそれを説明する方法を知りませんでしたが、ここでは(Pythonの)私がしようとしているものです:私が持っているリストから機能を選択すると、アレイに

初期化された関数のリスト、例えば[foo, bar]、そしてすべての入力に対して、私は使用する関数の関連するインデックスを持っています。入力配列X、インデックス配列Iが与えられたら、上の条件を仮定して出力配列yを生成する必要があります。

私のソリューション:

## These are just example methods, in reality there are complex functions 
def foo(x): 
    return x 
def bar(x): 
    return x - 1 

f = [foo, bar] 
X = [1, 2, 3, 1, 2, 5, 3, 6, 8, 2, 1, 4, 5, 7, 8, 1] 
I = [0, 1, 0, 1, 1, 1, 1, 0, 0, 1 ,0, 0, 0, 0, 0, 1] 

solution_functions = numpy.take(f, I) 
solution_result = [solution_functions[idx](X[idx]) for idx in I] 

私の質問はそれを行うための、より効率的な方法がある - 問題はXは、要素の数千人を持っており、fの関数は本当に複雑であれば、私が作成しなければならないことですあまりにも多くのオブジェクト

答えて

3

は、あなたは確かに、以下に変更することで、ロジックを簡素化することができます。

>>> [f[i](x) for x, i in zip(X, I)] 
[1, 1, 3, 0, 1, 4, 2, 6, 8, 1, 1, 4, 5, 7, 8, 0] 

なお番目の場合eの長さがXIで異なる場合は、最短の長さに切り捨てられます。

関数zipは、イテレータを返します。これにより、メモリがより効率的になります。同じ高価な関数を同じ値で複数回実行することが予想される場合は、たとえばfunctools.lru_cacheの関数を装飾するなどして、キャッシュを実装することもできます。

これらの値をループし、同時にそれらをすべて必要としない場合は、角括弧の代わりに括弧で囲んでジェネレータ式にすることができます。必要なときに各値を計算します。

関連する問題