2014-12-04 65 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] 
相关问题