为了让我的 Python3 代码更优雅,我面临着一个具有挑战性的问题。
假设我有一个具有可变数量的不同输入的数字函数,例如如下所示:
def fun1(a,b):
return a+b
def fun2(c,d,e):
return c*d + e
def fun3(x):
return x*x
这些函数需要聚集在一个函数中,该函数需要用作数值求解器的优化函数。
但是我需要使用这些函数创建各种运算的不同组合,例如将前两个函数的输出相乘并与第三个相加。
手动解决方案是创建特定的 lambda 函数:
fun = lambda x : fun1(x[0],x[1])*fun2(x[2],x[3],x[4]) + fun3(x[4])
但是我拥有的函数数量很多,我需要生成它们所有可能的组合。
我希望能够系统地组合这些函数,并始终了解从高级函数 fun
的参数到每个函数的低级参数的映射。
在这种情况下,我手动指定 x[0]
对应于 fun1
的参数 a
,x[1]
对应于 fun1
等的参数 b
。
有什么想法吗?
最佳答案
听起来您正在尝试做所谓的 symbolic regression .这个问题通常通过遗传算法的一些变体来解决,这些算法对基因中的功能关系进行编码,然后根据包括预测误差和惩罚更复杂关系的项的适应度函数进行优化。
这里有两个库可以为您解决这个问题:
以下类提供了一种基本的方法来组合函数并跟踪每个函数所需的参数数量,这似乎是您遇到的主要问题:
class Wrapper:
def __init__(self, f):
self.f = f
self.n = f.__code__.co_argcount
def __call__(self, x):
return self.f(*x)
def __add__(self, other):
return Add(self, other)
def __mul__(self, other):
return Mul(self, other)
class Operator:
def __init__(self, left, right):
self.left = left
self.right = right
self.n = left.n + right.n
class Mul(Operator):
def __call__(self, x):
return self.left(x[:self.left.n]) * self.right(x[self.left.n:])
class Add(Operator):
def __call__(self, x):
return self.left(x[:self.left.n]) + self.right(x[self.left.n:])
要使用它们,您首先要为每个函数创建包装器:
w1 = Wrapper(fun1)
w2 = Wrapper(fun2)
w3 = Wrapper(fun3)
然后您可以添加和乘以包装器以获得一个新的类似函数的对象:
(w1 + w2*w3)([1, 2, 3, 4, 5, 6])
关于python - 生成 lambda 函数组合的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49047684/