计算引用具有"nan"值的变量的 SymPy 表达式



我一直在使用SymPy函数parse_expr()来评估引用变量的字符串表达式。现在,我在解析包含具有"nan"值的变量的表达式时遇到了问题。我试图通过将{"nan": 0}之类的东西作为local_dictglobal_dict参数传递来将"nan"值替换为0,但找不到使其工作的方法。

如何解析和计算引用具有"nan"值的变量的表达式?我可以通过将参数传递给"nan"映射到特定值parse_expr()吗?

>>> from sympy.parsing.sympy_parser import parse_expr
>>> data = {'result': {'a': 'nan', 'b': 123}}
>>> expr = "result['b'] + 123"    # <-- This works well.
>>> parse_expr(expr, data)
>>> 246
>>> expr = "result['a'] + 123"    # <-- This doesn't work.
>>> parse_expr(expr, data)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File ".../sympy-1.2rc1-py3.6.egg/sympy/parsing/sympy_parser.py", line 950, in parse_expr
return eval_expr(code, local_dict, global_dict)
File ".../sympy-1.2rc1-py3.6.egg/sympy/parsing/sympy_parser.py", line 863, in eval_expr
code, global_dict, local_dict)  # take local objects in preference
File "<string>", line 1, in <module>
TypeError: must be str, not Integer

实际的nan值由 SymPy 理解,并得到适当的处理:

from math import nan
data = {'result': {'a': nan, 'b': 123}}
expr = "result['a'] + 123"
parse_expr(expr, local_dict=data)   # returns nan

结果是正确的:nan 加上任何数字都是 nan。

但是你的字典包含一个字符串'nan'它没有特殊的含义:它也可以'foo'。这只是坏数据,所以你应该在将数据传递给 SymPy 之前修复数据:

data = {'result': {'a': 'nan', 'b': 123}}
for key in data['result']:
if data['result'][key] == 'nan':
data['result'][key] = 0

现在parse_expr(expr, local_dict=data)返回 123。

Sympy 应该被构建为处理nans。问题是它不会自动将'nan'转换为浮点nan。例如,以下操作也会失败:

>>> from sympy.parsing.sympy_parser import parse_expr
>>> data = {'result': {'a': '321', 'b': 123}}
>>> expr = "result['b'] + 123"    # <-- This works well.
>>> parse_expr(expr, data)
246
>>> expr = "result['a'] + 123"    # <-- This doesn't work.
>>> parse_expr(expr, data)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/jonathan/anaconda3/lib/python3.7/site-packages/sympy/parsing/sympy_parser.py", line 950, in parse_expr
return eval_expr(code, local_dict, global_dict)
File "/home/jonathan/anaconda3/lib/python3.7/site-packages/sympy/parsing/sympy_parser.py", line 863, in eval_expr
code, global_dict, local_dict)  # take local objects in preference
File "<string>", line 1, in <module>
TypeError: can only concatenate str (not "Integer") to str

使用浮点nan而不是字符串可以:

>>> from sympy.parsing.sympy_parser import parse_expr
>>> from math import nan
>>> data = {'result': {'a': nan, 'b': 123}}
>>> expr = "result['b'] + 123"    # <-- This works well.
>>> parse_expr(expr, data)
246
>>> expr = "result['a'] + 123"    # <-- This also works.
>>> parse_expr(expr, data)
nan

最新更新