将numpy与sympy相结合

7

I have a the following code:

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定义一个模型,如果可能,在更新函数中用x值替换sympy变量。这是否可行?我该如何做到这一点?

1个回答

13

我可以提供两个解决方案。

首先,有一个名为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

@TobiasKienzler, 实际上我非常不喜欢lambdify在当前状态下的表现。它是一个混乱且不可预测的函数,甚至没有一个明确定义的应用范围。有时候它会返回符号对象,而本意是要用于数值评估。 - Krastanov
哦,那真不幸 :-( 我到目前为止还没有使用它太多,但是它背后的想法听起来确实很棒.... - Tobias Kienzler
它对于简单的交互工作已经足够好了,但例如针对绘图模块完全重新实现了(但由于差异和所有继承的怪异性质,新版本尚未在全局命名空间中公开)。如果您有兴趣,还有其他选项,如使用C、Fortran和Theano进行代码生成和自动编译。 - Krastanov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接