我目前与 sympy 存在以下“问题”:
我有一个象征性的表达,比如M = matrix([pi*a, sin(1)*b])
我想要lambdify
并传递给数值优化器。问题是优化器需要函数来输入/输出形状的 numpy 数组(n,)
特别是不(n,1)
.
现在我已经能够通过以下代码(MWE)实现这一目标:
import numpy as np
import sympy as sp
a, b = sp.symbols('a, b')
M = sp.Matrix([2*a, b])
f_tmp = sp.lambdify([[a,b]], M, 'numpy')
fun = lambda x: np.reshape( f_tmp(x), (2,))
现在,这当然非常难看,因为每次都需要应用重塑fun
被评估(可能会很多次)。有办法避免这个问题吗?这Matrix
根据定义,类始终是二维的。我尝试使用sympy
's MutableDenseNDimArray
-class,但它们不能与lambdaify一起使用。 (符号变量无法被识别)
一种方法是将矩阵转换为嵌套列表并获取第一行:
fun = sp.lambdify([[a, b]], M.T.tolist()[0], 'numpy')
Now fun([2, 3])
is [4, 3]
。这是一个 Python 列表,而不是 NumPy 数组,但优化器(至少是 SciPy 中的优化器)应该可以接受。
一个也可以做
fun = sp.lambdify([[a, b]], np.squeeze(M), 'numpy')
它还返回一个列表。
在我的测试中,上述速度同样快,并且比具有包装功能的版本更快(无论是np.squeeze
or np.reshape
):大约 6 µs 与 9 µs。看来好处在于消除了一个函数调用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)