2014-12-04 93 views
1

我在Sympy中有一個索引符號x,並且表達式是第二度單項式的和,如x[1]*x[2] + x[3]**2 + x[4]*x[1]。我想將這樣一個表達式轉換爲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 2014-12-04 21:20:33

+0

請注意,它可能會給'x [i,j]'或它可能會給'x [j,i]'。 – asmeurer 2014-12-04 22:29:00

回答

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

可以使用replaceWild

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] 
相關問題