sympy

2012-04-12 9 views
7

でnumpyのを組み合わせる私は次のコードを持っている:sympy

p = classp(); 
for i in range(1,10): 
    x = numpy.array([[2],[4],[5]]) 
    print p.update(x) 

class classp: 
    def __init__(self): 
     self.mymodel = array([2*x[1]], [3*x[0]], [x[2]]); 
    def update(self, x): 
     return self.mymodel #replace x(0)...x(1) with the given parameter 

私の質問は、上記のコードを関連している、私はsympyを交換、その後更新機能では、それが可能だ場合sympyを使用してモデルを定義したいと思いますがx値を持つ変数。出来ますか?どうやってやるの?

答えて

12

私はあなたに2つの解決策を提案できます。

まず、lambdifyで使用するために作成されたDeferedVectorがあります:

In [1]: from sympy.matrices import DeferredVector 

In [2]: v = DeferredVector('v') 

In [3]: func = lambdify(v, Matrix([v[1], 2*v[2]])) 

In [4]: func(np.array([10,20,30])) 
Out[4]: 
     [[20] 
     [60]] 

しかしlambdifyは私の好みのためにあまりにも多くの魔法を行います。

In [11]: x1, x2, x3 = symbols('x1:4') 

In [12]: m = Matrix([x2,2*x1,x3/2]) 

In [13]: m.subs({x1:10, x2:20, x3:30}) 
Out[13]: 
     ⎡20⎤ 
     ⎢ ⎥ 
     ⎢20⎥ 
     ⎢ ⎥ 
     ⎣15⎦ 

あなたはそのような置換のための辞書を作成することができます:

dict(zip(symbols('x1:4'), your_value_array))

別のオプションは.subsメソッドを使用することです。

すべての戻りオブジェクトがsympy行列であることを忘れないでください。 numpy配列に変換するには、np.array(the_matrix_in_question)を使用し、dtypeを指定することを忘れないでください。それ以外の場合は、デフォルトでdtype=objectになります。

+0

+1 [lambdify](http://docs.sympy.org/dev/modules/utilities/lambdify.html) –

+0

@TobiasKienzlerについては、実際には現在の状態でlambdifyを強く嫌っています。それはアプリケーションの明確な範囲を持っていなくても複雑で予期しない機能です。場合によっては、ポイント全体を数値評価に使用するときに記号オブジェクトを返すことさえあります。 – Krastanov

+0

ああ、それは残念です:-(私はそれほど多くはこれまで使っていませんが、その背後にあるアイデアは本当に素晴らしいと思います。 –