[英]SymPy: lambdify with 2-D inputs
我正在計算一個方陣V
,它的每個元素都是我用sympy
計算的積分。 我只計算一個定積分V_nm
,其結果是一個帶有符號索引m
和n
的數值表達式。 說V_nm
看起來像這樣:
>>> V_nm
sin(3*n)*cos(m)
現在我希望使用m
和n
作為數組的索引,從V_nm
制作一個二維數值(不是符號!)矩陣。 假設一個2 x 2矩陣,給定V_nm
的結果將是:
[[sin(3)cos(1) sin(3)cos(2)]
[sin(6)cos(1) sin(6)cos(2)]]
即, n
指定列, m
指定行。 (注意:我從1而不是0開始m
和n
,但這沒關系)。
我如何實現這一目標?
我知道我可以在列表理解中使用V_nm.subs([(n, ...), (m, ...)])
后跟evalf()
但這是一條漫長的道路。 我希望使用lambdify
來實現這一點。 我知道如何對一維 arrays 使用lambdify
。 你能告訴我如何為二維 arrays 實現它嗎?
有 sympy 的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.]])
您要問的內容看起來不像標准功能。 但是分兩步就可以了。 首先對表達式進行lambdify ,然后創建一個function,通過numpy的廣播生成預期的二維數組:
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)
。
作為測試,function(例如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)
Output:
array([[101, 102, 103],
[201, 202, 203]])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.