Sympy:使用 Wild 符号替换
Sympy: Replacement using Wild symbols
我正在尝试进行通用子表达式替换。
我想将 x*y
形式的任何表达式完全替换为 c
。
请注意,x
和 y
可以是表达式中的任何符号。
在下面的代码中,我使用 Wild 来实现这一点,但显然我无法仅使用 Wild 匹配符号,而不是子表达式 - 即使使用 isinstance=[sp.Symbol]
.
import sympy as sp
a, b, c = sp.symbols('a b c')
f= a*b - b
x = sp.Wild('x', isinstance=[sp.Symbol])
y = sp.Wild('y', isinstance=[sp.Symbol])
expr = f.replace(x*y, c)
这导致以下结果,
print expr
c
预期的答案是:c - b
非常感谢您的帮助!
谢谢!
试试这个:
syms = sorted(set(a for a in f.atoms() if type(a) == sp.Symbol), key=str)
f.subs((s1*s2, c) for s1, s2 in it.combinations(syms, 2))
在这个例子中似乎工作正常:
import itertools as it
a, b, c, d = sp.symbols('a b c d')
f = 3*a**2*b*c**b+b*c**2+25+(a+b+c*a/4)/(a*c+3**(b*c))-8
syms = sorted(set(a for a in f.atoms() if type(a) == sp.Symbol), key=str)
repls = [(s1*s2, d) for s1,s2 in it.combinations(syms, 2)]
print('variables: ' + str(syms))
print('replacements: ' + str(repls))
expr = f.subs(repls)
print('Before: ' + str(f))
print('After: ' + str(expr))
isinstance
不是 Wild
的真正论据。
您要查找的参数是properties
。虽然它似乎没有记录,但该参数采用一个函数列表,这些函数应该适用于匹配的表达式。您可以使用它来匹配带有
的符号
In [7]: f= a*b - b
In [14]: y = sp.Wild('y', properties=[lambda x: isinstance(x, Symbol)])
In [15]: x = sp.Wild('x', properties=[lambda x: isinstance(x, Symbol)])
In [16]: f.replace(x*y, c)
Out[16]: -b + c
我正在尝试进行通用子表达式替换。
我想将 x*y
形式的任何表达式完全替换为 c
。
请注意,x
和 y
可以是表达式中的任何符号。
在下面的代码中,我使用 Wild 来实现这一点,但显然我无法仅使用 Wild 匹配符号,而不是子表达式 - 即使使用 isinstance=[sp.Symbol]
.
import sympy as sp
a, b, c = sp.symbols('a b c')
f= a*b - b
x = sp.Wild('x', isinstance=[sp.Symbol])
y = sp.Wild('y', isinstance=[sp.Symbol])
expr = f.replace(x*y, c)
这导致以下结果,
print expr
c
预期的答案是:c - b
非常感谢您的帮助!
谢谢!
试试这个:
syms = sorted(set(a for a in f.atoms() if type(a) == sp.Symbol), key=str)
f.subs((s1*s2, c) for s1, s2 in it.combinations(syms, 2))
在这个例子中似乎工作正常:
import itertools as it
a, b, c, d = sp.symbols('a b c d')
f = 3*a**2*b*c**b+b*c**2+25+(a+b+c*a/4)/(a*c+3**(b*c))-8
syms = sorted(set(a for a in f.atoms() if type(a) == sp.Symbol), key=str)
repls = [(s1*s2, d) for s1,s2 in it.combinations(syms, 2)]
print('variables: ' + str(syms))
print('replacements: ' + str(repls))
expr = f.subs(repls)
print('Before: ' + str(f))
print('After: ' + str(expr))
isinstance
不是 Wild
的真正论据。
您要查找的参数是properties
。虽然它似乎没有记录,但该参数采用一个函数列表,这些函数应该适用于匹配的表达式。您可以使用它来匹配带有
In [7]: f= a*b - b
In [14]: y = sp.Wild('y', properties=[lambda x: isinstance(x, Symbol)])
In [15]: x = sp.Wild('x', properties=[lambda x: isinstance(x, Symbol)])
In [16]: f.replace(x*y, c)
Out[16]: -b + c