簡體   English   中英

SymPy:使用二維輸入進行lambdify

[英]SymPy: lambdify with 2-D inputs

我正在計算一個方陣V ,它的每個元素都是我用sympy計算的積分。 我只計算一個定積分V_nm ,其結果是一個帶有符號索引mn的數值表達式。 V_nm看起來像這樣:

>>> V_nm
sin(3*n)*cos(m)

現在我希望使用mn作為數組的索引,從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開始mn ,但這沒關系)。

我如何實現這一目標?
我知道我可以在列表理解中使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM