如何在IPython笔记本中打印带有名称的sympy变量?

时间:2017-01-27 15:32:44

标签: ipython-notebook jupyter-notebook sympy

考虑在IPython(Jupyter)笔记本中使用sympy定义的两个变量:

R_g     =Symbol(r'R_{g}')
L_g     =Symbol(r'L_{g}')

想象一下,我做了一些数学运算,然后我得到了一个复杂的表达式,其特征可用一个简单的例子说明如下:

 a=R_g*L_g
 print a

打印:

L_{g}*R_{g}

我希望它打印

R_g*L_g

而不是

$ R_g L_g $

原因是我想将此表达式复制粘贴到fortran代码中。这成为一个挑战,因为我使用Latex来格式化变量。所以我必须格式化具有

等变量的术语
 IL_np1  =Symbol(r'I_{L}^{n+1}')

2 个答案:

答案 0 :(得分:2)

您可以使用自定义符号子类,该子类使用latex()打印一种方式,使用fcode()打印另一种方式。

class CustomSymbol(Symbol):
    def __new__(cls, fcode_name, latex_name, **kwargs):
        x = Symbol.__new__(CustomSymbol, fcode_name, **kwargs)
        x.latex_name = latex_name
        return x

    def _latex(self, printer):
        return self.latex_name

就像

一样
In [114]: latex(CustomSymbol('x_2', 'x_{2}'))
Out[114]: 'x_{2}'

In [115]: fcode(CustomSymbol('x_2', 'x_{2}'))
Out[115]: '      x_2'

我已将默认名称设为fcode名称。如果您想要反过来,则可以定义_fcode而不是_latex

答案 1 :(得分:1)

只需恰当地命名您的符号:

R_g = Symbol(r'R_g')
L_g = Symbol(r'L_g')
a = R_g * L_g

print(a)

输出:

R_g*L_g

或手动清理:

>>> s = Symbol(r'I_{L}^{n+1}')
>>> s
I_{L}^{n+1}

def make_clean_name(symbol, toremove='{}', replace=None): 
    replace = {'^': '**'}  if replace is None else {}
    return ''.join(replace.get(x, x) for x in symbol.name if x not in toremove)

>>> make_clean_name(s)
'I_L**n+1'