首页 > 解决方案 > sympy:显示表达式中已替换的所有符号变量

问题描述

是否可以显示 sympy 表达式中涉及的所有符号变量?

以下是一些可能非常令人困惑的示例代码:

from sympy import *
from sympy.stats import Normal, sample, variance

sigma_eps = symbols('sigma_eps')
eps = Normal("eps", 0, sigma_eps)

sigma_any = eps + 1
sigma_1 = (eps+1).subs({sigma_eps:1})
sigma_10 = (eps+1).subs({sigma_eps:10})

如果您打印sigma_any, sigma_1sigma_10它们看起来都一样。他们都会告诉你,他们的价值是eps + 1。但实际上,这些值是完全不同的分布。

是否有可能揭示已经使用了哪些随机变量并且已经替换了一个表达式?

标签: pythonsympy

解决方案


一般规则(并非总是遵循)表达式的字符串形式应该是可复制和可粘贴的以重新创建对象。这种情况是一个例外,可以打开https://github.com/sympy/sympy/issues上的问题。

如果您检查 srepr 表格,您可以知道它们不一样:

>>> srepr(sigma_1)==srepr(sigma_10)
False

此外,free_symbols不会显示您想要的内容,但是替换前后原子之间的差异将揭示已更改的内容:

>>> sigma_any.free_symbols
{eps}
>>> sigma_any.atoms()
{0, 1, eps, sigma_eps}
>>> sigma_1.atoms()
{0, 1, eps}

请注意,sigma_eps最后一个输出中缺少。


推荐阅读