首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >形状为(n,)的Sympy lambdify阵列

形状为(n,)的Sympy lambdify阵列
EN

Stack Overflow用户
提问于 2018-07-03 21:39:11
回答 1查看 1K关注 0票数 2

目前,我对渐近有以下“问题”:

我有一个像M = matrix([pi*a, sin(1)*b])这样的符号表达式,我想要lambdify它并将其传递给数值优化器。问题是优化器需要该函数来输入/输出形状为(n,)而不是(n,1)的numpy数组。

现在,我已经能够通过以下代码(MWE)实现这一点:

代码语言:javascript
复制
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类始终是二维的。我试过使用sympyMutableDenseNDimArray-class,但它们不能与lambdify一起使用(符号变量无法识别)

EN

回答 1

Stack Overflow用户

发布于 2018-07-03 22:55:29

一种方法是将矩阵转换为嵌套列表,并取第一行:

代码语言:javascript
复制
fun = sp.lambdify([[a, b]], M.T.tolist()[0], 'numpy')

现在fun([2, 3])就是[4, 3]了。这是一个Python列表,不是一个NumPy数组,但是优化器(至少是SciPy中的优化器)应该可以接受。

一个人也可以做

代码语言:javascript
复制
fun = sp.lambdify([[a, b]], np.squeeze(M), 'numpy')

它还返回一个列表。

在我的测试中,上述两种方法的速度一样快,而且比带有包装函数的版本(无论是np.squeeze还是np.reshape)更快:大约6µs对9µs。似乎是因为消除了一个函数调用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51156059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档