我正在计算一个平方矩阵V,其中的每个元素都是我用sympy计算的积分。我只计算了一个定积分V_nm,其结果是一个符号指数m和n的数值表达式。假设V_nm看起来是这样的:
>>> V_nm
sin(3*n)*cos(m)现在我想做一个二维数值(不是象征性的!)矩阵从V_nm中取出,使用m和n作为数组的索引。对于2x2矩阵,给定V_nm的结果是:
[[sin(3)cos(1) sin(3)cos(2)]
[sin(6)cos(1) sin(6)cos(2)]]也就是说,n指定列,m指定行。(注意:我开始m和n的时间是1,而不是,但这并不重要)。
我怎样才能做到这一点?
我知道我可以在列表理解中使用V_nm.subs([(n, ...), (m, ...)]),然后是evalf(),但这是一条很长的路。我希望使用lambdify来实现这一点。我知道如何对一维数组使用lambdify .你能告诉我如何为二维数组实现它吗?
发布于 2020-05-30 11:15:52
你所要求的并不像一个标准的功能。但分两步是可能的。首先兰布迪表达式,然后创建一个函数,通过numpy的广播业生成预期的2D数组
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这样的函数可以很容易地验证该方法是否按预期工作。
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)输出:
array([[101, 102, 103],
[201, 202, 203]])发布于 2020-05-31 14:20:29
对于这种情况,有一种交感的FunctionMatrix。请注意,它使用了基于零的索引:
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.]])https://stackoverflow.com/questions/62098717
复制相似问题