web-dev-qa-db-ja.com

値の配列からsympy式を評価する

Sympyを試してみましたが、解決できない問題に遭遇しました。

Scipyを使用して、式を記述し、次のようにx値の配列を評価できます。

import scipy
xvals = scipy.arange(-100,100,0.1)
f = lambda x: x**2
f(xvals)

Sympyを使用すると、次のように同じ式を記述できます。

import sympy
x = sympy.symbols('x')
g = x**2

次のようにして、この式を単一の値で評価できます。

g.evalf(subs={x:10})

しかし、私はscipyで行ったように、x値の配列に対してそれを評価する方法を見つけることができません。どうすればいいですか?

35
mgoi

まず第一に、現時点では、SymPyは、この場合に必要なnumpy配列のサポートを保証していません。このバグレポートを確認してください http://code.google.com/p/sympy/issues/detail?id=537

次に、manyの値を数値で評価したい場合、SymPyは最良の選択ではありません(結局、これはシンボリックライブラリです)。 numpyとscipyを使用します。

ただし、何かを数値的に評価する正当な理由は、評価する式の導出が困難であったため、SymPyでそれを導出してから、NumPy/SciPy/C/Fortranで評価することです。式をnumpyに変換するには、

from sympy.utilities.lambdify import lambdify
func = lambdify(x, big_expression_containing_x,'numpy') # returns a numpy-ready function
numpy_array_of_results = func(numpy_array_of_arguments)

詳細については、lambdifyのdocstringを確認してください。 lambdifyにはまだいくつかの問題があり、書き換えが必要になる場合があることに注意してください。

補足として、式reallyを何度も評価する場合は、sympyのcodegen/autowrapモジュールを使用して、ラップされ、Pythonから呼び出し可能なFortranまたはCコード。

編集:SymPyで数値を実行する方法の更新リストはwikiにあります https://github.com/sympy/sympy/wiki/Philosophy-of-Numerics-and-Code-Generation-in- SymPy

42
Krastanov

受け入れられた答え は、OPが数値評価を探していたことを明確にしますが、私はまだできることを指摘しておきますsymarrayを使用してsymbolic評価も行う:

import sympy
xs = sympy.symarray('x', 10)
f = lambda x: x**2
f(xs)

収量

array([x_0**2, x_1**2, x_2**2, x_3**2, x_4**2, x_5**2, x_6**2, x_7**2,
       x_8**2, x_9**2], dtype=object)

これは内部的にnumpy配列も使用しますが、sympy.Expressionsで満たされた配列であることに注意してください。

8
Tobias Kienzler

または、numpy.vectorizeを使用して行うこともできます。質問の本文のxgxvalsを使用しています。

scalar_func = lambda xx: float(g.evalf(subs={x: xx}))
vector_func = numpy.vectorize(scalar_func)
vector_func(xvals) # returns a numpy array [10000.0, 9980.01, 9960.04, ...]
0
Jan X Marek