2012-10-04 22 views
2

假設我有其中我需要找到的總和的表達式:SciPy的/ numpy的:求和多個索引

enter image description here

其中界限是有限的和已知的。什麼是最快或最有效的方式去計算這樣的總和在scipy/numpy。它可以用嵌套for循環來完成,但有沒有更好的方法?

回答

4

如何

np.dot(x[:amax], np.cumsum(y[:amax] * np.sum(z[cmin:cmax]))) 
1

np.einsum可能是這些類型的總和的選擇了。不過nevsan顯示,對於b這是由a限制,您需要首先使用np.cumsumnp.einsum應該不會在給出的示例中更快。

它可能看起來像這樣:

y_acc = np.add.accumulate(y[:amax]) # same as cumsum 
result = np.einsum('i,i,j->', x[:amax], y_acc, z[cmin:cmax]) 

然而,這是increadibly慢,因爲einsum不優化的事實z總和只需要進行一次,所以你需要手動重新制定它:

result = np.einsum('i,i->', x[:amax], y_summed) * z[cmin:cmax].sum() 

應在這種情況下,然而應該是慢然後nevsan的np.dot基礎的做法,因爲dot一般應更好地優化(即np.einsum(ii->, a, b)慢則np.dot(a, b))。但是,如果你有更多的數組來總結,這可能是一個不錯的選擇。