2017-01-26 10 views
1

私は、コードのこの部分があります:私を与える2つの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オブジェクトである必要があります。

あなたはその後、lambdifyのための基本的なコードの流れはSymPy表現=> numpyの機能である

>>> a = np.array([2,3]) 
>>> b = np.array([1,2]) 
>>> f(a, b) 
array([3, 5]) 

を得るでしょう

a_var, b_var = symbols("a b") 
expr = a_var + b_var 
f = lambdify((a_var, b_var), expr, '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

あなたの例では、まずaシンボルとbシンボルを作成しています。私の例では、expr(式)とデータ(numpy配列)を引数として渡したいと思います。すべての関数に 'a_var、b_var = symbols(" ab ")'を持たなければなりません。それがはっきりしていることを望みます。 – George

+0

@Georgeは私の更新された答えを見てください。 – asmeurer

関連する問題