2014-12-04 2 views
1

나는 Sympy에서 인덱스 된 심볼 xx[1]*x[2] + x[3]**2 + x[4]*x[1]과 같은 2 차 monomials의 합인 표현식을 가지고있다. 그러한 표현을 x[1,2] + x[3,3] + x[4,1]으로 바꾸고 싶습니다. 즉, 대체하려면 x[i]*x[j] -> x[i,j]x [i] * x [j]와 x [i, j]의 Sympy 치환

색인이 나타날 수있는 상한이 있으므로, 각 대체를 하드 코딩하는 큰 테이블을 구성 할 수 있습니다. 더 좋은 방법이 있습니까?

코멘트에 응답 - X를 만들기 위해 내가

from sympy.tensor import IndexedBase 
x = IndexedBase('x') 
+0

x를 생성하는 데 사용한 코드를 표시 할 수 있습니까? – smichr

+0

'x [i, j]'를 주거나'x [j, i]'를 줄 수 있음에 유의하십시오. – asmeurer

답변

1
당신은 순서대로 인덱스를 넣어 주문 사용할 수 있습니다

:

>>> from sympy import * 
>>> i, j = symbols('i j', cls=Wild) 
>>> x = IndexedBase('x') 
>>> e = x[1]*x[3] + x[2]*x[1] + x[3]**2 
>>> def new(o, x): 
... if o.is_Mul: 
... i,j=list(ordered([i.args[1] for i in o.args])) 
... elif o.is_Pow: 
... i = j = o.base.args[1] 
... else: 
... raise NotImplementedError 
... return x[i, j] 
... 
>>> e.xreplace(dict([(o, new(o, x)) for o in e.find(x[i]*x[j])])) 
x[1, 2] + x[1, 3] + x[3, 3] 

그러나 같은 일을 할 수있는 간단한 방법은 대체 통화에서 낱낱 결과를 사용하는 것입니다

>>> e.replace(x[i]*x[j], Piecewise((x[i,j],i<j),(x[j,i],True))) 
x[1, 2] + x[1, 3] + x[3, 3] 
1

쓰기 당신은 Wildreplace를 사용할 수 있습니다.

In [1]: i, j = symbols('i j', cls=Wild) 

In [2]: x = IndexedBase('x') 

In [3]: e = x[1]*x[3] + x[2]*x[1] 

In [4]: e.replace(x[i]*x[j], x[i, j]) 
Out[4]: x[1, 2] + x[1, 3]