如何从 SymPy 表达式中提取所有数值?
例如,对于以下表达式:sin(a/pi + a) + 0.629116159212
,我需要 pi
、-1
和 0.629116159212
。
我在 SymPy 中找到了 srepr
函数,它返回以下示例:
Add(sin(Add(Mul(Pow(pi, Integer(-1)), Symbol('a')), Symbol('a'))), Float('0.62911615921200004', precision=53))
如何从中提取所有数字,即不是 Symbol
的所有内容?
最佳答案
方法
atoms
返回表达式的所有原子(即不可分割)组件的集合。属性
is_number
告诉您某个表达式(或原子)是否是数字。
综合:
from sympy import sin, pi
from sympy.abc import a
expr = sin(a/pi + a) + 0.629116159212
numbers = {atom for atom in expr.atoms() if atom.is_number}
<小时/>
现在,如果您需要保留出现次数,事情会变得有点复杂,因为 atoms
返回一个集合。
在这里,我们还可以使用:
替代方案 1:
sympy.preorder_traversal
(或postorder_traversal
),它迭代表达式的所有子表达式。 (感谢 Oscar Benjamin 和 A.S. Meurer 。)替代方案2: 表达式的
find
方法,返回匹配某个条件的所有表达式。属性
is_Atom
。
from sympy import sin, pi, preorder_traversal
from sympy.abc import a
expr = sin(a/pi + 1/a) + 0.629116159212
is_atomic_number = lambda expr: expr.is_Atom and expr.is_number
# Alternative 1:
[
subexpression
for subexpression in preorder_traversal(expr)
if is_atomic_number(subexpression)
]
# Alternative 2:
expr.find(is_atomic_number,group=True)
关于python - 从 SymPy 表达式中提取数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59922148/