Сохранение исходных индексов в индексированных объектах Sympy

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

from sympy.tensor import IndexedBase, Idx
C = IndexedBase("C")
i,j = Idx("i"), Idx("j") 
expr = C[i,j]
expr = expr.subs({i:1, j:2})

Можно ли получить исходные индексы (i, j) из expr? Поскольку выражения неизменяемы, любые изменения, которые я делаю в исходном выражении, не будут отображаться в новом выражении.

Я полагаю, что общий вопрос здесь заключается в том, как добавить дополнительную информацию к символам Sympy.


person mohamedmoussa    schedule 20.02.2015    source источник


Ответы (2)


Вы можете прикрепить общую информацию к таким символам, как symbols('x', integer=True), но вы не можете назначать значения. Однако вы можете создавать новые переменные с замененными символами. Это оставляет исходное выражение без изменений:

newexpr = expr.subs({i:1, j:2})
person smichr    schedule 20.02.2015
comment
Спасибо за ваш ответ. Однако я не уверен, что это отвечает на вопрос. Обратите внимание, что в моем коде я хочу получить (i,j) из final expr, который сейчас равен C[1,1]. Я хочу, чтобы индексированный объект мог запоминать свои исходные индексы. - person mohamedmoussa; 20.02.2015
comment
Для чего вам нужна эта информация? Как бы вы использовали эту информацию? - person smichr; 20.02.2015
comment
Из одного выражения я генерирую целую группу на основе диапазонов индексов. например A[i,j] может стать [A[1,1], A[1,2], A[1,3] ... ]. Затем я применяю преобразования к парам индексов, обычно сопоставляя две соседние пары с одной. Например, преобразуйте (i,j) в соответствии с правилом, которое говорит, где значения 1,1 уменьшаются до одного индекса 1. Итак, A[1,1] становится A[1]. Только один пример. - person mohamedmoussa; 20.02.2015
comment
Однако (мне) не ясно, почему вам нужно знать, каковы исходные индексы. Как вы используете i и j для принятия решения? - person smichr; 21.02.2015
comment
Если у меня есть выражение expr = A[1,2,3], которое произошло из исходного выражения A[i,j,k]. Я хочу сделать что-то вроде apply_some_rule(expr, (j,k)), и на выходе будет A[1,5], где пара 2,3 была сопоставлена ​​с 5, исходя из того факта, что j,k были 2-м и 3-м индексами. Это может быть большое выражение с множеством терминов, где позиции индекса различаются для каждого термина. - person mohamedmoussa; 21.02.2015

SymPy не «запоминает», откуда что-то взялось после выполнения subs. Вы должны структурировать свой код так, чтобы исходное выражение сохранялось.

person asmeurer    schedule 22.02.2015