【问题标题】:Sympy lambdify error in combination with arraysSympy lambdify 结合数组的错误
【发布时间】:2017-04-03 09:28:45
【问题描述】:

我想用 sympy 对数组输入进行 lamdify。这是我的第一次尝试:

import sympy as sym
import numpy as np

# Load Data
data = np.loadtxt( "D:\data.r2023.c87.dat", skiprows=1) 

# Access to columns
vza = data [:,2]
sza = data [:,4]

# var_psi is the array input
psi = (1/(np.cos(sza))) + (1/(np.cos(vza)))
var_tau, var_omega, var_psi = sym.symbols('var_tau var_omega var_psi', real = True) 

sBetaFunc = sym.exp(-var_tau * var_psi)
sBeta = sym.lambdify(var_psi, sBetaFunc, modules=[“numpy”, "sympy"])

如果我现在尝试调用该函数,则会出现以下错误:

>>> sBeta(psi)
>>> AttributeError: 'Mul' object has no attribute 'exp'

如果我这样尝试,会出现以下错误:

>>> sBeta(*psi)
>>> TypeError: <lambda>() takes exactly 1 argument (79 given)

我阅读了很多关于这个问题的信息。但是,似乎没有什么适合我的问题或我的情况。

我需要在 sympy 函数中使用它,因为我想使用 sympy 中的 diff 函数来区分一些非常复杂的函数。

先谢谢你了。

编辑:

现在我尝试了这个:

import sympy as sym
import numpy as np
from sympy.abc import w, x, y, z    

sBetaFunc = sym.exp(-var_tau * x)
sBeta = sym.lambdify(x, sBetaFunc, modules=["sympy"])

现在出现一个不同的错误:

>>> sBeta(psi)
>>> ValueError: sequence too large; cannot be greater than 32

【问题讨论】:

    标签: python python-2.7 numpy sympy


    【解决方案1】:

    我不完全确定您收到的所有错误消息;我发现的一件事是它可能是由clash in name space 引起的。当您显式导入函数时,这可能不是这里的问题。我认为这是因为您没有为var_tau 提供值。

    以下应该做你试图完成的事情:

    import sympy as sym
    import numpy as np
    
    var_tau, var_omega, var_psi = sym.symbols('var_tau var_omega var_psi', real=True)
    
    sBetaFunc = sym.exp(-var_tau * var_psi)
    
    # also take your tau into account
    sBeta = sym.lambdify((var_tau, var_psi), sBetaFunc, modules=np)
    
    # your data; replace with actual values
    psi = np.array([1, 2, 3])
    
    # your value for tau
    my_tau = 1.
    
    # evaluate your function
    result = sBeta(my_tau, psi)
    

    然后result 看起来像这样:

    array([ 0.36787944,  0.13533528,  0.04978707])
    

    【讨论】:

    • 感谢您提供有用而全面的回复!
    【解决方案2】:

    如果有人遇到同样的问题,我会为您提供解决方案: 根据@Cleb 的回答,我解决了这个问题:

        psi = np.array([1, 2, 3])
    
        var_tau = sym.symbols('var_tau', real = True)        
    
        sBeta = sym.lambdify((x, y), np.e**(-x*y), ["numpy", "sympy"])
        result = sBeta(var_tau, psi)
    

    然后result 看起来像这样:

    array([2.71828182845905**(-var_tau), 2.71828182845905**(-2*var_tau),
       2.71828182845905**(-3*var_tau)], dtype=object)
    

    现在我可以像这样使用 sym.diff 函数了:

    In [1]: sym.diff(result[1], var_tau)
    Out[1]: -2.0*2.71828182845905**(-2*var_tau)
    

    但是,如果我像处理变量一样处理 var_tau,它的效果会非常好。

    【讨论】:

    • 虚幻与 np.e**。你刚刚为我节省了大量时间。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多