SymPy автоматически обрабатывает выражения - PullRequest
4 голосов
/ 22 июня 2011

Я использовал SymPy для конвертации выражений в латекс (чтобы потом их рендерил Matplotlib). например,

from sympy import latex, sympify
from sympy.abc import x

str = '2*x + 3*x'

TeX = latex(sympify(str))

Проблема в том, что оно автоматически обрабатывает выражение, поэтому 2 * x + 3 * x автоматически становится 5 * x и т. Д .; это не то, чего я хочу (не спрашивай!).

Ответы [ 3 ]

5 голосов
/ 23 июня 2011
Класс

Sympy's Add обрабатывает добавление символов. Вы можете указать ключевое слово в качестве аргумента, чтобы остановить автоматический сбор терминов.

from sympy import Add
from sympy.abc import x

eq = Add(2*x, 3*x, evaluate=False)

# this will print: 2*x + 3*x
print eq

Это может быть не совсем то, что вы хотите, основываясь на вашем ответе на комментарий phimuemue.

1 голос
/ 22 ноября 2011

На самом деле, когда вы вызываете sympify (str), он пытается проанализировать выражение и преобразовать их в классы по умолчанию. В этом случае будет вызван Add(2*x,2*x) (с параметром по умолчанию evalaute = True), поэтому он стал 5*x. Если вы хотите избежать этого, либо вы должны вызвать Add(2*x,3*x,evaluate=False), либо использовать некоторую глобальную переменную и проверить метод init класса AssocOp в core-> operation.py

Я делаю это

 try:
        import __builtin__
        evaluate_expr=__builtin__.evaluate_expr
    except AttributeError ,ex:
        pass 

    if ((not options.pop('evaluate', True)) or (evaluate_expr==False)) :

** Примечание. Для функции используйте кеширование, поэтому если вы вызываете одну и ту же функцию (скажем: sympy("2*x+3*x")) два раза. Первый раз с помощью переменной gloabl evalute=True и второй раз с evaluate=False. в обоих случаях из-за кеширования вы получите один и тот же результат. Поэтому вам нужно обновить методы, такие как ( add , mul ) в классе core-> expr. что-то вроде ниже

def __add__(self, other):
        #simplifychange:
        evaluate_expr=self.get_evaluate()
        return Add(self, other,evaluate=evaluate_expr)

Но я предположу, что было бы лучше, если бы вы не использовали оценку = Ложь. Поведение Симпи кардинально изменится. проблемы, с которыми я столкнулся в этом сообщении

0 голосов
/ 24 ноября 2013

>>> импорт ре

>>> re.sub ("(^ | [\ (\ [\ {\ + \ - \ * /, \: =]) (\ -? [0-9] * \.? [0- 9] +) "," \\ 1 Dummy ('\\ 2') ", '2 * x + 3 * x')

"Пустышка ('2') * x + Пустышка ('3') * x"

>>> eval (_)

2⋅x + 3⋅x

>>> латекс (_)

'2 х + 3 х'

...