Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用lamdify-pass表达式作为函数参数添加两个numpy数组_Python_Numpy_Sympy - Fatal编程技术网

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)