Python 使用lamdify-pass表达式作为函数参数添加两个numpy数组
我有一段代码:Python 使用lamdify-pass表达式作为函数参数添加两个numpy数组,python,numpy,sympy,Python,Numpy,Sympy,我有一段代码: import numpy as np import sympy from sympy import symbols from sympy.utilities.autowrap import ufuncify from sympy.utilities.lambdify import lambdify def test(expr,a,b): a_var, b_var = symbols("a b") #f = ufuncify((a_var, b_var), e
import numpy as np
import sympy
from sympy import symbols
from sympy.utilities.autowrap import ufuncify
from sympy.utilities.lambdify import lambdify
def test(expr,a,b):
a_var, b_var = symbols("a b")
#f = ufuncify((a_var, b_var), expr, backend='numpy')
f = lambdify( (a_var, b_var), expr, 'numpy')
return f(a_var, b_var)
a = np.array([2,3])
b = np.array([1,2])
expr = a + b
print(test(expr, a, b))
这给了我:
../anaconda3/envs/python3/lib/python3.6/site-packages/sympy/core/sympify.py:282: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future
rational=rational) for x in a])
File "<string>", line 1
lambda _Dummy_52,_Dummy_53: ([3 5])
SyntaxError: invalid syntax
======更新===============================
我发现的一个解决方案是像字符串一样使用expr
,然后在函数内部使用sympify
:
data_a = np.array([2,3])
data_b = np.array([1,2])
expr = "data_a + data_b"
def test(expr,data_a, data_b):
a, b = symbols("data_a data_b")
expr = sympify(expr)
f = lambdify( (a, b), expr, 'numpy')
return f(data_a, data_b)
我正在考虑:
[35]
但是如何避免将表达式用作字符串?
lambdify
将SymPy表达式转换为NumPy函数。您正在尝试将NumPy数组转换为NumPy函数。lambdify
的参数必须是SymPy对象
你想要什么
a_var, b_var = symbols("a b")
expr = a_var + b_var
f = lambdify((a_var, b_var), expr, 'numpy')
然后你会得到
>>> a = np.array([2,3])
>>> b = np.array([1,2])
>>> f(a, b)
array([3, 5])
lambdify
的基本代码流是SymPy expression=>NumPy函数。为了让您的头脑和代码保持清晰,您应该从SymPy开始,操纵表达式,直到有一个lambdifed函数。然后将其用于NumPy数据。从定义符号名称开始。然后,您可以根据这些符号定义表达式,而无需使用字符串(例如,如上所述)。一旦有了表达式和符号,就可以创建一个lambdified函数。此时,将NumPy数组传递到函数中。我建议对SymPy符号/表达式和NumPy数组使用不同的变量名,以免混淆。我还建议对符号使用与符号名称本身相同的变量名称,这样当您打印表达式时,它将与您编写的表达式完全相同(例如,下面如果您print(expr)
,您将得到a+b
,这正是您要得到expr
)所写的内容)
在更新的示例中,您可以使用
a, b = symbols("a b")
expr = a + b
f = lambdify((a, b), expr, 'numpy')
data_a = np.array([2,3])
data_b = np.array([1,2])
f(data_a, data_b)
请注意,我是如何从创建SymPy符号和从这些符号创建SymPy表达式开始的。然后我把它弄脏了。一旦它被lambdified,我就拥有lambdified函数(
f
)。在这一点上,我不再使用SymPy了,只使用NumPy数组(数据)和lambdified函数f
你能给我举个例子,说明如何将表达式和变量作为参数传递给函数吗?就像我举的例子一样?因为,无论我尝试什么,它都会给出一个错误。只有使用表达式作为字符串才能像我在帖子中所说的那样工作。谢谢在您的示例中,您首先使用a和b符号,然后使用expr。在我的示例中,我希望将expr(表达式)和数据(numpy数组)作为参数传递。我必须使用a_var,b_var=symbols(“a b”)
在每个函数中都是局部的。我希望它是清楚的。谢谢,我理解了。因此,没有办法实现我想要的。因此,将表达式和用作数据的变量作为函数的参数。我必须首先使用符号
(在函数外部)并定义表达式(再次在函数外部),当然可以,但是您需要始终使用相同的符号名称,或者将符号名称作为参数传递给函数。嗨,我可以问一下吗?lambdify在引擎盖下是如何工作的?它逐元素计算?行numpy数组?因此,无论我必须lambdify的输入是什么,它都会逐元素进行计算?
a, b = symbols("a b")
expr = a + b
f = lambdify((a, b), expr, 'numpy')
data_a = np.array([2,3])
data_b = np.array([1,2])
f(data_a, data_b)