4

次のラムダから IPython シェルで関数を動的に作成したいとします。

f = lambda x, ci: np.percentile(x, 100-ci)

ci新しい値に固定されます。次のようなものになります(create_new_f私が探しているものです)。

ci = 20
new_f = create_new_f(f, ci=ci)
result = new_f([20,30,50,80])

私は次のように使用functools.partialしてみました:

new_f = functools.partial(f, ci=20)

しかし、これを IPythonの組み込みシェルで実行すると、次のようになります。

AttributeError: 'functools.partial' object has no attribute '__module__'

おそらくデコレータを使用して、これを行うの方法はありますか?

トピックの背景:

繰り返しますが、私が探しているのは、これを行うの方法です。

4

1 に答える 1

4

組み込み IPython のソリューション、

クロージャーで実装できます(これが解決策になると思います):

import numpy as np
def partial_f(ci):
    def fn(x):
        return np.percentile(x, 100-ci)
    return fn
new_f = partial_f(20)
new_f([20,30,50,80])

戻り値

62.000000000000014

チェックする:

functools.partial仕事中のIDEのシェルで私のために働きます:

import functools
import numpy as np
f = lambda x, ci: np.percentile(x, 100-ci)
ci = 20
new_f = functools.partial(f, ci=ci)
new_f([20,30,50,80])

戻り値

62.000000000000014

ラムダの場合 (これは、私が試したIPython オンライン シェルでは機能しますが、あなたのケースでは機能しないようです):

import numpy as np
pf = lambda ci: lambda x: np.percentile(x, 100-ci)
new_f2 = pf(20)
new_f2([20,30,50,80])

も返す

62.000000000000014
于 2014-06-02T19:39:40.910 に答える