2017-04-03 57 views
1

我想使用sympy对数组输入进行分级。这是我第一次尝试:Sympy lambdify与数组结合错误

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 

回答

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]) 
+1

谢谢你的帮助和全面的答复! – petermailpan

0

如果谁面临着同样的问题I'll有一个人解决方案为您: 根据@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它工作得很好。