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

How do I print a sympy variable with its name in an IPython notebook?

考虑在 IPython (Jupyter) notebook 中使用 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_gL_g$

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

之类的变量的术语
 IL_np1  =Symbol(r'I_{L}^{n+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'

您可以使用自定义 Symbol 子类,它以一种方式打印 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