目前,我对渐近有以下“问题”:
我有一个像M = matrix([pi*a, sin(1)*b])这样的符号表达式,我想要lambdify它并将其传递给数值优化器。问题是优化器需要该函数来输入/输出形状为(n,)而不是(n,1)的numpy数组。
现在,我已经能够通过以下代码(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的MutableDenseNDimArray-class,但它们不能与lambdify一起使用(符号变量无法识别)
发布于 2018-07-03 22:55:29
一种方法是将矩阵转换为嵌套列表,并取第一行:
fun = sp.lambdify([[a, b]], M.T.tolist()[0], 'numpy')现在fun([2, 3])就是[4, 3]了。这是一个Python列表,不是一个NumPy数组,但是优化器(至少是SciPy中的优化器)应该可以接受。
一个人也可以做
fun = sp.lambdify([[a, b]], np.squeeze(M), 'numpy')它还返回一个列表。
在我的测试中,上述两种方法的速度一样快,而且比带有包装函数的版本(无论是np.squeeze还是np.reshape)更快:大约6µs对9µs。似乎是因为消除了一个函数调用。
https://stackoverflow.com/questions/51156059
复制相似问题