7

次のコードがあります。

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値に置き換えます。出来ますか?どうやってやるの?

4

1 に答える 1

13

2つの解決策を提案できます。

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

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 は、私の好みにはあまりにも多くの魔法を行います。

別のオプションは、次の.subs方法を使用することです。

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)).

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

于 2012-04-13T09:25:08.483 に答える