2017-01-26 5 views
1

나는이 코드 조각이 : 내게 줄이 개 NumPy와 배열 lamdify 사용하여 추가 - 통과 식을 함수 인수로

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 

나는 ufuncify 사용하는 경우 :

... 

TypeError: unhashable type: 'numpy.ndarray' 

During handling of the above exception, another exception occurred: 
... 

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

================

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) 

내가 복용하고 있습니다 :

[3 5]

을하지만이 같은 표현을 사용하지 않도록 할 수있는 방법 내가 찾은한 가지 해결책은 문자열과 같은 expr를 사용하고 함수 내에서 sympify을 사용하는 것입니다 끈?

답변

1

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 표현 => NumPy와 기능을 얻을 것이다합니다. 머리 부분과 코드에서 명확한 내용을 유지하려면 SymPy로 시작하고 lambdified 기능이있을 때까지 표현식을 조작해야합니다. 그런 다음 NumPy 데이터와 함께 사용하십시오. 먼저 심볼 이름을 정의하십시오. 그런 다음 문자열을 사용하지 않고 기호를 사용하여 표현식을 정의 할 수 있습니다 (예 : 위에서 수행 한 것처럼). 표현식과 기호가 있으면 lambdified 함수를 만듭니다. 이 때 NumPy 배열을 함수에 전달합니다. SymPy 기호/표현식과 NumPy 배열에 다른 변수 이름을 사용하여 혼합되지 않도록하는 것이 좋습니다. 또한 기호 이름과 같은 기호를 사용하여 기호 이름과 동일한 변수 이름을 사용하는 것이 좋습니다. 그러면 표현식을 인쇄 할 때 정확하게 표현할 수 있습니다 (예 : print(expr) 인 경우 아래에 a + b이 표시됩니다. 쓰기를하면 expr이됩니다.) 업데이트 된 예에서

, 당신은 내가 SymPy 기호와 그 기호에서 SymPy 표현을 만드는 시작하는 방법

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) 

주를 사용할 수 있습니다. 그런 다음 나는 그것을 암기한다. lambdified되면, 나는 lambdified 함수 (f). 이 시점에서 필자는 더 이상 SymPy를 사용하지 않고 NumPy 배열 (데이터)과 lambdified 함수 f 만 사용합니다.

+0

표현식과 변수를 함수의 인수로 전달하는 방법에 대한 예제를 제공해 주시겠습니까? 제 예제가 있습니까? 왜냐하면 어떤 식 으로든 시도하면 오류가 발생합니다. 표현식을 문자열로만 사용하는 것은 상태로 작동합니다. 내 게시물에. 감사합니다 – George

+0

귀하의 예제에서, 당신은 첫 번째와 b 기호를 만들고 다음 expr.In 내 예제를 사용하여, 나는 expr (표현식) 및 데이터 (numpy 배열) 인수로 전달하고 싶습니다. 그리고 난 모든 함수에'a_var, b_var = symbols ("ab")'가 있어야합니다.나는 그것이 분명하기를 바란다. – George

+0

@George 내 업데이트 된 답변을 참조하십시오. – asmeurer