如何在 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
。
考虑在 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
。