Sympy:lambda 化使得对数组的操作总是产生数组,对于常量也是如此?

Abe*_*rez 5 python numpy sympy

我需要在许多点上评估用户给出的函数(f')的导数。这些点位于列表中(或 numpy.array、pandas.Series...)。当 f' 取决于 sympy 变量时,我获得了预期值,但当 f' 是常量时,我​​获得了预期值:

import sympy as sp

f1 = sp.sympify('1')
f2 = sp.sympify('t')

lamb1 = sp.lambdify('t',f1)
lamb2 = sp.lambdify('t',f2)

print(lamb1([1,2,3]))
print(lamb2([1,2,3]))
Run Code Online (Sandbox Code Playgroud)

我得到:

1
[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

第二个是好的,但我预计第一个将是一个列表。

这些函数位于矩阵中,是 sympy 运算(例如求导)的最终结果。f1 和 f2 的确切形式因问题而异。

Joh*_*anC 2

lamb1是一个返回常量 1: 的函数 def lamb1(x): return 1

lamb2是一个返回其参数的函数: def lamb2(x): return x

因此,输出非常符合预期。

这是一种可能有效的方法。我将测试函数更改为f2to t*t,因为这在我的测试中更烦人(处理 Pow(t,2))。

import sympy as sp
import numpy as np

f1 = sp.sympify('1')
f2 = sp.sympify('t*t')

def np_lambdify(varname, func):
    lamb = sp.lambdify(varname, func, modules=['numpy'])
    if func.is_constant():
        return lambda t: np.full_like(t, lamb(t))
    else:
        return lambda t: lamb(np.array(t))

lamb1 = np_lambdify('t', f1)
lamb2 = np_lambdify('t', f2)

print(lamb1(1))
print(lamb1([1, 2, 3]))
print(lamb2(2))
print(lamb2([1, 2, 3]))
Run Code Online (Sandbox Code Playgroud)

输出:

1
[1 1 1]
4
[1 4 9]
Run Code Online (Sandbox Code Playgroud)