如何使 Sympy lambdify(ed) 函数接受数组输入?
How to make a Sympy lambdify(ed) function accept array input?
我正在尝试在 Python 2.7 中创建一个函数,它接受一个函数句柄和函数中的变量数作为输入,returns 一个计算梯度的新函数输入函数。这是我目前所拥有的。
import sympy as sym
import numpy as np
def getSymbolicGradient(func,numVars):
# Initialize Some Variables
g = numVars * [0]
# Create All the Symbolic Variables
x = sym.symarray('x',numVars)
# Calculate the Gradients
for i in range(numVars):
g[i] = sym.diff(func(x),x[i])
gradFunc = sym.lambdify(x, g, modules="numpy")
return gradFunc
假设我使用 gradFunc
和以下代码:
def myVecFunc(x):
return 2*x[0]**2 + 4*x[1] + 2
gradFunc = getSymbolicGradient(func=myVecFunc, numVars=2)
如果我使用两个单独的参数调用它,它会起作用,例如:
print( gradFunc(1,2) )
但是,如果我使用单个参数(例如 Numpy 数组)调用它,
print( gradFunc(np.array([1,2])) )
我收到以下错误:
TypeError: () takes exactly 2 arguments (1 given)
如何让 lambdify
接受输入参数作为单个值内的单个数组?是否有更好的(内置的)Sympy 方法来为接受数组作为输入的函数的梯度生成符号表达式?
我对numpy不太熟悉,但一般在Python中你可以使用*
运算符来解压数组值。
a = [2, 4, 6]
my_func(*a)
在逻辑上等同于
a = 2
b = 4
c = 6
my_func(a, b, c)
我正在尝试在 Python 2.7 中创建一个函数,它接受一个函数句柄和函数中的变量数作为输入,returns 一个计算梯度的新函数输入函数。这是我目前所拥有的。
import sympy as sym
import numpy as np
def getSymbolicGradient(func,numVars):
# Initialize Some Variables
g = numVars * [0]
# Create All the Symbolic Variables
x = sym.symarray('x',numVars)
# Calculate the Gradients
for i in range(numVars):
g[i] = sym.diff(func(x),x[i])
gradFunc = sym.lambdify(x, g, modules="numpy")
return gradFunc
假设我使用 gradFunc
和以下代码:
def myVecFunc(x):
return 2*x[0]**2 + 4*x[1] + 2
gradFunc = getSymbolicGradient(func=myVecFunc, numVars=2)
如果我使用两个单独的参数调用它,它会起作用,例如:
print( gradFunc(1,2) )
但是,如果我使用单个参数(例如 Numpy 数组)调用它,
print( gradFunc(np.array([1,2])) )
我收到以下错误:
TypeError: () takes exactly 2 arguments (1 given)
如何让 lambdify
接受输入参数作为单个值内的单个数组?是否有更好的(内置的)Sympy 方法来为接受数组作为输入的函数的梯度生成符号表达式?
我对numpy不太熟悉,但一般在Python中你可以使用*
运算符来解压数组值。
a = [2, 4, 6]
my_func(*a)
在逻辑上等同于
a = 2
b = 4
c = 6
my_func(a, b, c)