SymPy Lambdify能否替换Add、Mul核心函数实现自定义运算?
自定义SymPy加法/乘法实现符号方程计算
问题背景
需要用自定义加法和乘法实现ad(b + c)这类基础符号方程的计算。尝试用lambdify替换SymPy的Add和Mul为自定义函数,但无法成功触发自定义逻辑。
初始尝试(失败)
先测试仅替换Add的场景,代码如下:
from sympy import * import numpy as np x, y = symbols('x y') A = [1,1] B = [2,2] def addVectors(inA, inB): print("running addVectors") return np.add(inA, inB) # Test vector addition print(addVectors(A,B)) # Now using lambdify f = lambdify([x, y], x + y, {"add":addVectors}) print(f(A, B)) # <------- expect [3,3] and addVectors to be run a second time # but I get the same as this print(A + B)
运行结果不符合预期:自定义addVectors未被调用,反而执行了列表拼接。尝试多种lambdify参数配置均无效。
验证语法正确性:参照文档替换cos为自定义函数可正常运行,推测Add和Mul作为SymPy的表达式类型而非普通函数,无法被lambdify直接识别替换。
解决方案:结合replace与lambdify
通过replace将表达式类型替换为支持多参数的SymPy函数,再用lambdify映射到自定义逻辑,实现通用场景需求。代码如下:
from sympy import * import numpy as np w, x, y, z = symbols('w x y z') A = [3,3] B = [2,2] C = [1,1] D = [4,4] def addVectors(*args): result = args[0] for arg in args[1:]: result = np.add(result, arg) return result def mulVectors(*args): result = args[0] for arg in args[1:]: result = np.multiply(result, arg) return result expr = w*z*(x + y) print(expr) expr = expr.replace(Add, lambda *args: lerchphi(*args)) expr = expr.replace(Mul, lambda *args: Max(*args)) print(expr) f = lambdify([w, x, y, z], expr, {"lerchphi":addVectors, "Max":mulVectors}) print(f(A, B, C, D)) print(mulVectors(A,D,addVectors(B,C)))
关键说明
- 利用
replace实现表达式类型到函数的转换; - 替换需选用支持多参数输入的SymPy函数,目前找到
Min、Max、lerchphi三个符合要求; - SymPy会自动简化
Min和Max,无法同时使用,因此选用lerchphi(加法映射)和Max(乘法映射); - 最后通过
lambdify将这两个SymPy函数映射到自定义的addVectors和mulVectors。
内容的提问来源于stack exchange,提问作者xareth
相关产品推荐
相关产品推荐

