Как реализовать функцию на Python(Sympy), реализующую то же самое, что и ToExpression в Wolfram Mathematica?

В Wolfram Mathematica я могу использовать ToExpression для преобразования строки в выражение и вычисления выражения.

Пример:

Reflection[expr_, a_] := expr /. a[l_] -> I*a[-l]
StringA = "Reflection[a[0]b[3],b]"
Output=ToExpression[StringA]

результат ia[0]b[-3]

Однако я не знаю, как реализовать такое в Python (или Sympy).

import numpy as np
import sympy as sp

a, b, c, d, e, f=map(sp.IndexedBase,['a','b','c','d','e', 'f'])  
l1=map(sp.Wild,['l1'])
imagI=sp.I ## equals to Imaginary

def Reflection(expr, p):
    expr=imagI*expr.replace(p[l1],p[-l1], map=False, simultaneous=True, exact=False)
    return expr

fundict = {'Reflection':Reflection}
pdict = {'a':a,'b':b,'c':c,'d':d,'e':e,'f':f}  ##A dictionary used for connect the string to existed variable
mydict=dict(fundict,**pdict) ## combine two dictionary

StringA ='Reflection(a(0)b(3),b)'

Как реализовать ту же работу, что и ToExpression?

И более сложный случай:

Reflection[expr_, a_] := expr /. a[l_] -> I*a[-l]
OAMHolo[expr_, a_, n_] := expr /. a[l_] -> a[l + n]

StringA = "Reflection[OAMHolo[Reflection[a[0]b[3],b],a,3],b]"
Output=ToExpression[StringA]

Вывод -a[3]b[3]

Для случаев с Python я пробовал exec(), replace(), но они не работают. Итак, как реализовать этот случай в Python? Большое спасибо!

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
123
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

sympify преобразует строку в выражение. Чтобы использовать пользовательские объекты в sympify, передайте их как словарь второму аргументу.

Вот ваш пример (я также исправил некоторые мелкие ошибки)

>>> l1 = Wild('l1')
>>> StringA = 'Reflection(a[0]*b[3], b)'
>>> sympify(StringA, mydict)
I*a[0]*b[-3]

Что касается sympify и eval, sympify использует eval внутри. Это немного умнее,

  • sympify('1/2') будет производить Rational(1, 2), тогда как eval('1/2') производит 0.5.
  • sympify также автоматически преобразует любые неопределенные переменные в выражении в символ или функцию, тогда как eval этого не делает.
  • sympify автоматически оценивает выражение в пространстве имен SymPy, поэтому любая функция SymPy будет определена автоматически (с eval вам нужно либо импортировать имя вручную, либо добавить его в словарь в качестве второго аргумента)
  • В будущем sympify может стать лучше eval с точки зрения безопасности (см. https://github.com/sympy/sympy/pull/12524). На данный момент оба могут выполнять произвольный код, поэтому их небезопасно использовать для ненадежного ввода.

Производительность любого из них должна быть незначительной. Поэтому я бы рекомендовал использовать sympify, а не eval для создания выражений SymPy.

Спасибо большое. Я нашел другой способ сделать это, просто используя eval(). Честно говоря, я не знаю, что быстрее или они одинаковы.

Xuemei 05.04.2019 16:36

@XuemeiGu Я отредактировал свой ответ, указав различия между sympify и eval.

asmeurer 05.04.2019 20:37

Другие вопросы по теме