使用字典时Python eval()无法识别numpy与math符号的问题
解决含numpy/math模块的数组公式求值问题
问题原因
当给eval()传入第二个参数作为全局命名空间时,Python不会自动将当前作用域中的math、np等模块导入到这个自定义命名空间里,因此公式里的np.e、math.erf会因找不到定义而报错。
解决方案
方案1:将模块加入自定义命名空间
直接把math和np添加到变量字典中,确保eval能识别这些模块:
import math import numpy as np formula = 'np.e**x + math.erf(x) + np.pi + math.erf(u)' var = {'x': np.array([1,1]), 'u': np.array([0.1,0.2]), 'math': math, 'np': np} result = eval(formula, var) print(result)
方案2:合并全局命名空间与自定义变量
用globals()获取当前全局作用域的所有变量(包括已导入的模块),和自定义变量字典合并后传给eval:
import math import numpy as np formula = 'np.e**x + math.erf(x) + np.pi + math.erf(u)' var = {'x': np.array([1,1]), 'u': np.array([0.1,0.2])} result = eval(formula, {**globals(), **var}) print(result)
方案3:改用numpy矢量化函数(推荐)
math.erf仅支持单个数值,无法直接处理数组(数组长度大于1时会报错),建议替换为numpy原生的np.erf,它天然支持数组运算,更适配你的场景:
import numpy as np formula = 'np.e**x + np.erf(x) + np.pi + np.erf(u)' var = {'x': np.array([1,1]), 'u': np.array([0.1,0.2])} result = eval(formula, {**globals(), **var}) print(result)
内容的提问来源于stack exchange,提问作者ogledala
相关产品推荐
相关产品推荐

