我有一个2参数的python函数
def foo(x,y):
// a numeric operation that returns a double
我需要使用scipy.optimize.minimize来定位一个点附近的f的最小点,比如说(1.2,3.4)
我试过
scipy.optimize.minimize(foo, (1.2, 3.4))
scipy.optimize.minimize(foo, [1.2, 3.4])
和
scipy.optimize.minimize(foo, *[1.2,3.4])
它们都不起作用,产生
TypeError: function takes exactly 2 arguments (1 given)
所以我的唯一解决方案似乎是包装函数,例如
scipy.optimize.minimize(lambda X:foo(*X), [1.2,3.4]),
最后一个有效,但我担心带有lambda术语的额外层会引入不必要的时间开销。因为我的应用程序对性能高度敏感,所以我要求一个有效的解决方案让scipy.optimize.minimize接受foo的输入对,而不会产生潜在的时间开销。任何的想法?谢谢。
答案 0 :(得分:3)
您应该根据单个(可能是多维)参数定义您的函数。因此,您不使用
def foo(x,y):
// a numeric operation that returns a double
但是
def foo(x):
// use x[0] in place of original x
// and x[1] in place of original y
例如对于你使用的f(x,y)= x + y ^ 2
def foo(x):
return x[0] + x[1] ** 2
如果您不允许修改foo
,那么您可以随时使用其他功能
def foowrap(x):
return foo(x[0], x[1])
这应该稍微高效一点,然后将列表展开到位置参数(*运算符)
只是为了测试
>>> timeit.timeit('foowrap([1,2])', setup='from __main__ import foowrap', number=10000000)
5.230706214904785
>>> timeit.timeit('foo([1,2])', setup='from __main__ import foo', number=10000000) # this is your lambda term
5.379893779754639
如此非常小的加速,但确实如此。