Man*_*ish 5 python numpy sympy
我希望能够定义一个表达式,该表达式获取定义它的变量的所有值,并在未定义时将表达式计算为0.与此类似: -
import numpy as np
import sympy as sp
def expr(k1, k2):
x, y =sp.symbols('x y')
if x == k1 :
fn = 0
else:
fn = np.divide(1,(x-k1)*(y-k2))
return fn, x, y
f,x, y = expr(1,2)
print(f)
fx = f.subs({x:1,y:4})
print(fx)
Run Code Online (Sandbox Code Playgroud)
那么,一旦定义了函数,如何检查相等或条件?
fn = 1 /(x-1)(y-2); 如何将x = 1或y = 2设置为0?
asm*_*rer 12
如果您想要一个符号功能,请使用 Piecewise
expr = Piecewise((0, Eq(x, k1)), (1/(x - k1)/(y - k2), True))
Run Code Online (Sandbox Code Playgroud)
如果您以后想要在数值上计算此表达式,则应将其转换为带有的数值函数 lambdify
f = lambdify((x, y, k1, k2), expr, 'numpy')
Run Code Online (Sandbox Code Playgroud)
我不建议尝试混合使用NumPy和SymPy函数,因为这通常不起作用.NumPy函数不知道如何使用SymPy表达式,SymPy函数不知道如何使用NumPy数组.更好的方法是使用SymPy创建符号表达式,然后根据需要对其进行操作,然后使用lambdify
它将其转换为NumPy函数.
您应该在函数内定义一个函数,然后返回它。像这样:
import numpy as np
import sympy as sp
def expr(k1, k2):
x, y =sp.symbols('x y')
def fn(x, y):
if x==k1:
return 0
else:
return np.divide(1, (x-k1)*(y-k2))
return fn, x, y
f, x, y = expr(1, 2)
print(f(x, y))
print(f(1, 4))
Run Code Online (Sandbox Code Playgroud)
编辑:
sp.lambdify
这是评论中所要求的一种使用方法:
x_dot = 1 / ((x - 1) * (y - 2))
f = lambda a, b : 0 if a==1 or b==2 else sp.lambdify((x,y), xdot, "numpy")(a,b)
Run Code Online (Sandbox Code Playgroud)
另一种选择是使用sp.subs
f = lambda a, b: 0 if a==1 or b==2 else float(x_dot.subs({x:a, y:b}))
Run Code Online (Sandbox Code Playgroud)