【问题标题】:How to make a Sympy lambdify(ed) function accept array input?如何使 Sympy lambdify(ed) 函数接受数组输入?
【发布时间】:2016-04-12 09:17:19
【问题描述】:

我正在尝试在 Python 2.7 中创建一个函数,它接受函数句柄和函数中的变量数作为输入,并返回一个计算输入函数梯度的新函数。这是我目前所拥有的。

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: () 正好接受 2 个参数(给定 1 个)

如何让lambdify 接受输入参数作为单个值内的单个数组?是否有更好的(内置)Sympy 方法来为接受数组作为输入的函数的梯度生成符号表达式?

【问题讨论】:

    标签: python python-2.7 sympy lambdify


    【解决方案1】:

    我对 numpy 不太熟悉,但通常在 Python 中你可以使用 * 运算符来解包数组值。

    a = [2, 4, 6]
    my_func(*a)
    

    逻辑上等价于

    a = 2
    b = 4
    c = 6
    my_func(a, b, c)
    

    【讨论】:

    • 谢谢!这行得通。我还发现在lambdify中在变量周围添加括号也可以,例如:gradFunc = sym.lambdify([x], g, modules="numpy")
    • @JohnnyNeiferd:在x 周围添加方括号应该什么都不做,因为lambdify 将可迭代的符号或单个符号作为输入。测试它证实了这一点,即括号不能解决您的问题。
    • 我尝试使用括号,它似乎适用于 python 3.6.5 和 sympy 1.1.1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多