首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SymPy:具有二维输入的lambdify

SymPy:具有二维输入的lambdify
EN

Stack Overflow用户
提问于 2020-05-30 06:33:06
回答 2查看 395关注 0票数 2

我正在计算一个平方矩阵V,其中的每个元素都是我用sympy计算的积分。我只计算了一个定积分V_nm,其结果是一个符号指数mn的数值表达式。假设V_nm看起来是这样的:

代码语言:javascript
复制
>>> V_nm
sin(3*n)*cos(m)

现在我想做一个二维数值(不是象征性的!)矩阵从V_nm中取出,使用mn作为数组的索引。对于2x2矩阵,给定V_nm的结果是:

代码语言:javascript
复制
[[sin(3)cos(1) sin(3)cos(2)]
 [sin(6)cos(1) sin(6)cos(2)]]

也就是说,n指定列,m指定行。(注意:我开始mn的时间是1,而不是,但这并不重要)。

我怎样才能做到这一点?

我知道我可以在列表理解中使用V_nm.subs([(n, ...), (m, ...)]),然后是evalf(),但这是一条很长的路。我希望使用lambdify来实现这一点。我知道如何对一维数组使用lambdify .你能告诉我如何为二维数组实现它吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-30 11:15:52

你所要求的并不像一个标准的功能。但分两步是可能的。首先兰布迪表达式,然后创建一个函数,通过numpy的广播业生成预期的2D数组

代码语言:javascript
复制
from sympy import sin, cos, lambdify
from sympy.abc import m, n
import numpy as np

V_mn = sin(3 * n) * cos(m)

V_mn_np = lambdify((m, n), V_mn)
# using list comprehension:
# V_mn_np2D = lambda m, n: np.array([[V_mn_np(i, j) for j in range(n)] for i in range(m)])
# using numpy's broadcasting (faster for large arrays):
V_mn_np2D = lambda m, n: V_mn_np(np.arange(m)[:, None], np.arange(n))

V_mn_np2D(2, 2)

要使编号开始于1而不是0,请使用np.arange(1, m+1)np.arange(1, n+1)

作为一种测试,像100 * m + n这样的函数可以很容易地验证该方法是否按预期工作。

代码语言:javascript
复制
W_mn = 100 * m + n

W_mn_np = lambdify((m, n), W_mn)
W_mn_np2D = lambda m, n: W_mn_np(np.arange(1, m+1)[:, None], np.arange(1, n+1))

W_mn_np2D(2, 3)

输出:

代码语言:javascript
复制
array([[101, 102, 103],
       [201, 202, 203]])
票数 1
EN

Stack Overflow用户

发布于 2020-05-31 14:20:29

对于这种情况,有一种交感的FunctionMatrix。请注意,它使用了基于零的索引:

代码语言:javascript
复制
In [1]: m, n, i, j = symbols('m, n, i, j')                                                                                        

In [2]: V_nm = FunctionMatrix(m, n, Lambda((i, j), 100*(i+1) + (j+1)))                                                            

In [3]: V_nm                                                                                                                      
Out[3]: [100⋅i + j + 101]

In [4]: V_nm.subs({m:2, n:3}).as_explicit()                                                                                       
Out[4]: 
⎡101  102  103⎤
⎢             ⎥
⎣201  202  203⎦

In [5]: lambdify((m, n), V_nm)(2, 3)                                                                                              
Out[5]: 
array([[101., 102., 103.],
       [201., 202., 203.]])
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62098717

复制
相关文章

相似问题

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