You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用SymPy将字符串函数表达式转为支持NumPy数组的函数?

将SymPy表达式转换为支持NumPy数组的函数

推荐方案:使用sympy.lambdify

lambdify是SymPy专门用来将符号表达式转换为可调用函数的工具,能直接生成兼容NumPy数组的代码,效率远高于手动subs循环。

完整代码示例

import sympy as sp
import numpy as np

# 注意:SymPy中幂运算用**,^是异或,需修正表达式写法
expr = "x**2 + y**2"
f = sp.sympify(expr)

# 手动指定变量顺序(避免free_symbols无序导致的参数顺序混乱)
vars = [sp.Symbol('x'), sp.Symbol('y')]
# 生成支持NumPy的函数
f_np = sp.lambdify(vars, f, modules='numpy')

# 测试传入NumPy数组
x_arr = np.array([1, 2, 3])
y_arr = np.array([4, 5, 6])
result = f_np(x_arr, y_arr)
print(result)  # 输出: [17 29 45]

关键说明

  • modules='numpy'指定生成的函数使用NumPy的运算逻辑,自动支持数组广播、向量化计算。
  • 手动指定变量顺序[sp.Symbol('x'), sp.Symbol('y')]很重要,因为f.free_symbols是无序集合,直接使用可能导致参数顺序混乱。

备选方案:结合numpy.vectorize(不推荐)

如果一定要用subs,可以用numpy.vectorize将单值替换的函数包装成支持数组的版本,但此方法本质是循环处理每个元素,效率极低,仅适合小数据量场景。

代码示例

import sympy as sp
import numpy as np

expr = "x**2 + y**2"
f = sp.sympify(expr)

# 定义单值替换的函数
def single_subs(x, y):
    return float(f.subs({sp.Symbol('x'): x, sp.Symbol('y'): y}))

# 包装成支持数组的函数
f_np_vec = np.vectorize(single_subs)

# 测试
x_arr = np.array([1, 2, 3])
y_arr = np.array([4, 5, 6])
result = f_np_vec(x_arr, y_arr)
print(result)  # 输出: [17. 29. 45.]

重要注意事项

  • SymPy中幂运算必须用**,字符串里的^会被解析为逻辑异或(XOR),如果你的表达式是想表示平方/幂,一定要把x^2改成x**2,否则结果完全不符合预期。

内容的提问来源于stack exchange,提问作者Governor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 07:09:26