Python numexpr:以科学计数法计算复数会产生“ValueError”

问题描述 投票:0回答:2

我正在使用 Python numexpr 模块来评估用户输入(数字或公式)。数字可能很复杂,只要我避免使用科学记数法,这就有效:

>>> import numexpr as ne
>>> ne.evaluate("1000000000000j")
array(0.+1.e+12j)
>>> ne.evaluate("0.+1.e+12j")
ValueError: Expression 0.+1.e+12j has forbidden control characters.

我尝试用科学计数法计算具有一些变化的复数,并期望 numexpr 处理这些数字。然而,我总是遇到上面描述的 ValueError。

这是一个错误还是我做错了什么?

python complex-numbers scientific-notation numexpr
2个回答
1
投票

尝试计算表达式

numexpr
时使用
"0.+1.e+12j"
看到的错误是由于
numexpr
解析复数的方式与标准 Python 不同。它不接受
"0.+1.e+12j"
为有效,因为它更喜欢显式定义数字和逻辑单元之间的运算的表达式。

但是,如果将表达式重新修改为

"1.e+12 * 1j"
numexpr
会正确处理它,因为此选项通过乘法运算显式分离标量和虚数单位,
numexpr
可以有效处理:

>>> ne.evaluate("1.e+12 * 1j")
array(0.+1.e+12j)

1
投票

这是一个错误,正如 @jason 评论的那样:

https://github.com/pydata/numexpr/issues/442#issuecomment-1754515334

https://github.com/pandas-dev/pandas/issues/54449

https://github.com/pandas-dev/pandas/issues/54542


使用

ast
代替

import ast
ast.literal_eval("0.+1.e+12j")

numexpr
使用
eval()
,这是一个很大的安全问题。

© www.soinside.com 2019 - 2024. All rights reserved.