web-dev-qa-db-ja.com

SymPy行列をnumpy配列/行列に変換する最良の方法は何ですか

sympyMutableDenseMatrixnumpy.arrayまたはnumpy.matrixに変換するために使用しているアプローチが現在の良い方法であるかどうかはわかりません。

私は次のようなシンボリック行列を持っています:

g = sympy.Matrix( [[   x,  2*x,  3*x,  4*x,  5*x,  6*x,  7*x,  8*x,   9*x,  10*x]
                   [x**2, x**3, x**4, x**5, x**6, x**7, x**8, x**9, x**10, x**11]] )

そして私はnumpy.arrayに変換しています:

g_func = lambda val: numpy.array( g.subs( {x:val} ).tolist(), dtype=float )

ここで、xの特定の値の配列を取得します。

それを行うためのより良い組み込みソリューションがSymPyにありますか?

ありがとうございました!

16

私はここでクラスタノフとアスミューラーからのアドバイスを受けて答えています。この小さなスニペットは lambdify from sympyを使用しています:

from sympy import lambdify
g_func = lambdify( (x), g )

これは、質問が求めていることを達成するための最良の方法のようです。

12

これは最も簡単なように見えます:

np.array(g).astype(np.float64)

Astypeメソッドをスキップすると、numpyはタイプ 'object'の行列を作成しますが、これは一般的な配列操作では機能しません。

22
_ numpy.array(SympyMatrix.tolist()).astype(numpy.float64)
_

Sympy行列をネストされたインデックス付きのものにするためのネイティブのtolistメソッド

_numpy.array_は、ネストされたインデックスを配列にキャストできます

.astype(float64)は、配列の数値をデフォルトのnumpy float型にキャストします。これは、任意のnumpy行列操作関数で機能します。

追記として、numpyにキャストすると、sympy変数と式を維持しながら、行列演算を実行する機能が失われることに注意してください。

編集:私の追加の注意点は、numpy.arrayにキャストすると、マトリックス内の任意の場所に変数を持つ機能が失われることです。すべての行列要素は、キャストする前にすでに数値である必要があります。そうでない場合、すべてが壊れます。

5
D Adams

SymPy-0.7.6.1_mpmath_ matrix docs から、tolist()メソッドが存在します。

最後に、行列をネストされたリストに変換することができます。行列または配列(つまりNumPyまたはSymPy)を含むほとんどのPythonライブラリはこの形式をサポートしているため、これは非常に便利です。

B.tolist()
2
Henry