2017-06-03 50 views
0

我想做類似於this question的操作。集成一個返回矩陣numpy的函數

Nm, Mm = np.meshgrid(range(3), range(2)) 
y = lambda x: x*Nm + x*Mm 

然後,y返回3x2矩陣。我想將y從a整合到b,例如我們可以選擇a = 0和b = 1。這意味着積分矩陣的i,j分量應該是(x * i + x * j)dx的0到1的整數。如果我考慮到其中一個答案:

>>> a = [sin, cos] 
>>> vectorize(quad)(a, 0, pi) 

顯然a是功能列表,但是我有什麼是返回一個數組,這是不同的函數。我得到:

res = np.vectorize(integrate.quad)(y, 0, 1) 

error: Supplied function does not return a valid float. 

我該如何解決這個問題?感謝您的幫助

編輯:

期望的結果是

res = np.empty((3,2)) 
for i in range(3): 
    for j in range(2): 
     res[i, j] = quad(lambda x: x*i + x*j, 0, 1)[0] 
+0

因此,所期望的結果與'quad'有6次不同的'i'和'j'值嗎?參考向我們展示如何用顯式循環來做到這一點。 – hpaulj

+0

是@hpaulj這是所需的結果。 –

回答

2

通過一個lambda傳遞i,j另一種方法是使用args參數的quad

In [39]: def foo(x,i,j): 
    ...:  return x*i + x*j 
In [40]: i,j=1,2 
In [41]: integrate.quad(lambda x: x*i+x*j, 0,1) 
Out[41]: (1.5, 1.6653345369377348e-14) 
In [42]: integrate.quad(foo, 0, 1, args=(i,j)) 
Out[42]: (1.5, 1.6653345369377348e-14) 

這仍然分別評估每對i,j對的功能。

您或許可以將i,j迭代掩埋在np.vectorize函數中,但這不會提高速度。只有在您需要廣播幫助時,我纔會提倡。

一個類似的問題定期出現。人們希望對一系列功能或參數應用quad(或其他scipy函數)。但是,假設你想給集成步驟等提供全面的權力,那麼迭代是不可替代的。

1

你想就可以實現這種方式是什麼:

Nm, Mm = np.meshgrid(range(3), range(2)) 

def f(m,n): 
    def g(x): 
     return m*x+n*x 
    return g 

fv=np.vectorize(f) 

u=fv(Mm,Nm) 

np.vectorize(quad)(u,0,1) 

但沒有numpy的加速度將出現在這裏。它只是一種模仿裸體裸體風格的商品。

相關問題