2014-10-16 70 views

回答

2

也許這樣?

>>> s=Sum(Indexed('x',i),(i,1,3)) 
>>> f = lambda x: Subs(s.doit(), [s.function.subs(s.variables[0], j) 
... for j in range(s.limits[0][1], s.limits[0][2] + 1)], x).doit() 
>>> f((30,10,2)) 
42 
+0

謝謝!!雖然你的解決方案工作得很好,但爲了完成,我所尋找的不完全是這樣。在你的例子中,你限制從1到3的總和,而我想從0到n(基本上是一個可變大小的數組)。我想我現在知道如何去做,但我不知道如何正確地添加代碼給評論! – 2014-10-17 13:32:02

+1

@DiogoSantos你可以回答你自己的問題。 – asmeurer 2014-10-21 02:37:34

+0

因爲它不直截了當(sum文檔中沒有提到s.limits),所以可以添加一些解釋。我剛開始使用sympy;對於範圍(s.limits [0] [1],s.limits [0] [2])中的j,[s.function.subs(s.variables [0],j) ...在我看來, + 1)]用等同的整數替換索引元素,然後替換。這一步似乎是強制性的 – mattator 2016-04-28 13:58:41

0

您可以使用lambdify。只要確保總和的限制匹配numpy數組的迭代次數即可。

from sympy import Sum, symbols, Indexed, lambdify 
import numpy as np 

x, i = symbols("x i") 
s = Sum(Indexed('x',i),(i,0,3)) 
f = lambdify(x, s) 
b = np.array([1, 2, 3, 4]) 
f(b)