如何从SymPy表达式中提取所有数值?例如,对于这个表达式:sin(a/pi + a) + 0.629116159212
,我想pi
,-1
和0.629116159212
。
我srepr
在SymPy中找到了该函数,该函数返回示例:
Add(sin(Add(Mul(Pow(pi, Integer(-1)), Symbol('a')), Symbol('a'))), Float('0.62911615921200004', precision=53))
我如何从中提取所有数字,即不是a的所有数字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和AS Meurer。)
Alternative2: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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句