Симпи не оценит 2х, но оценит х * 2 - PullRequest
6 голосов
/ 23 февраля 2011

Я использую Sympy s sympify , чтобы упростить 2 выражения, чтобы я мог сравнить их на равенство.

Например:

expr1 = sympify("(2 * x) + (x + 10)")
expr2 = sympify("(x + 10) + (x * 2)")

if expr1 == expr2:
   print "Congrats those are essentially the same!"

Однако при использовании формы 2x применительно к x * 2 я получаю исключение при разборе, например:

expr1 = sympify("2x + (x + 10)")

Есть ли способ понять, что такое форма 2x ?

Если нет, есть ли какая-либо другая библиотека, которая разрешит эту форму?

Ответы [ 2 ]

3 голосов
/ 23 февраля 2011

Что ж, вы можете изменить лексер sympy (или парсер / грамматику / что угодно).

Вы также можете обернуть его функцией, которая преобразует ваши входные строки для вас, используя что-то вроде этого:

>>> import re
>>> expr = '2x + 1'
>>> re.sub(r"(\d+)(\w+)", r"(\1 * \2)", expr)
'(2 * x) + 1'

Но спросите себя, почему эта нотация не существует с самого начала.

Например, все они действительны на python, и, хотя я давно не играл с sympy, яДержу пари, что они означают что-то помимо умножения в sympy:

0x32  # hex for 50
5e-3  # 0.005
2j    # 2 * sqrt(-1) (so that one *is* multiplication, but by 1j, not j!)
15L   # 15 (L used to represent long integers in python)

И что означает x2?Это переменная с именем x2 или она означает (x * 2).Я специально исключил этот случай из приведенного выше регулярного выражения, потому что он настолько неоднозначный.

1 голос
/ 04 марта 2013

В разрабатываемой версии SymPy есть возможность разбирать такие выражения. См. http://docs.sympy.org/dev/modules/parsing#sympy.parsing.sympy_parser.implicit_multiplication_application.. В sympify он все еще не включен по умолчанию, потому что sympify делает только базовые расширения синтаксиса Python (т. Е. Перенос числовых литералов и неопределенных имен и преобразование ^ в **). Но есть пример, который показывает, как его использовать.

Обратите внимание, что в настоящее время это также относится и к применению неявных функций. Возможно, две функции должны быть разделены.

EDIT: эти функции разделяются в запросе на получение .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...