38

私は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値の配列に対してそれを評価する方法を理解することはできません。どうすればいいですか?

4

4 に答える 4

46

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

第二に、多くの値について数値的に何かを評価したい場合、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にはまだいくつかの問題があり、書き直しが必要な場合があることに注意してください。

ちなみに、式を何度も評価したい場合は、sympyのcodegen / autowrapモジュールを使用して、Pythonからラップされて呼び出し可能なFortranまたはCコードを作成できます。

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

于 2012-05-21T10:55:21.380 に答える
8

受け入れられた答えは、OPが数値評価を探していたことを明らかにしていますが、それでも、以下を使用してシンボリック評価を行うこともできることを指摘しますsymarray

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内部的に配列を使用しますが、1つは本質で満たされていることに注意してsympy.Exprください。

于 2013-04-10T07:43:51.580 に答える
0

または、numpy.vectorizeを介してそれを行うことができます。x、、、gおよびxvals質問本文から使用しています。

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, ...]
于 2019-09-10T15:13:58.463 に答える
-3

試す

import sympy
x = sympy.symbols('x')
f = lambda x: x**2
print [f(k) for k in range(4)]

またはあなたも試すことができます

g = x**2
print [g.subs(x,k) for k in range(4)]
于 2012-05-21T05:26:51.443 に答える