Извлечение чисел из выражения SymPy - PullRequest
1 голос
/ 26 января 2020

Как извлечь все числовые значения из выражения 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))

Как извлечь из этого все числа, т. Е. Все, что не является Symbol?

1 Ответ

1 голос
/ 26 января 2020
  • Метод atoms возвращает набор всех атомов атома c (т.е. нерасщепляемых) компонентов выражения.

  • Атрибут 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), которая перебирает все подвыражения выражения. (Благодаря Оскару Бенджамину и 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...