我使用的是Sympy1.0和Python2.7。我要计算前100个整数的和:
此代码成功运行
import sympy as sy
from sympy.tensor import IndexedBase, Idx
import numpy as np
x = sy.IndexedBase('x')
i = sy.symbols('i', cls=Idx)
s = sy.Sum(x[i], (i, 0, 100))
s_lambda = sy.lambdify(sy.DeferredVector('x'), s, 'numpy')
s_lambda(np.arange(101))
并按预期给出5050
。但是当我试图用Product
而不是Sum
来做同样的事情时:
我得到了NameError: global name 'Product' is not defined
我做错什么了?有没有一个变通办法来得到我想要的?在
编辑1:
如果我事先不知道Product
的极限怎么办。比如说
import sympy as sy
from sympy.tensor import IndexedBase, Idx
import numpy as np
x = sy.IndexedBase('x')
i = sy.symbols('i', cls=Idx)
n = sy.symbols('n', integer=True, positive=True)
s = sy.Product(x[i], (i, 0, n))
s_lambda = sy.lambdify((sy.DeferredVector('x'), n) s.doit(), 'numpy')
s_lambda(np.arange(101), 5)
编辑2:
我想找个解决办法。NameError: global name 'Product' is not defined
由于以下原因而出现错误:
在
lambdastr((sy.DeferredVector('x'), n), p)
这就产生了:
lambda x,n: (Product(x[i], (i, 0, n)))
而对于Sum
,我们得到了一个有效的lambda函数:
lambda x,n: ((builtins.sum(x[i] for i in range(0, n+1))))
此时,问题围绕Product
函数的定义展开。根据手册,我可以通过dict
注入我对函数的定义
在
def my_prod(a, b):
# my implementation
pass
my_fun = {"Product" : my_prod}
f = sy.lambdify((sy.DeferredVector('x'), n), p, modules=['numpy', my_fun])
f([1,2,3,4,5], 2)
问题是,当我尝试使用lambdified函数f
时,出现了list indices must be integers, not Symbol
错误。我想这是由于i
是一个符号,而它应该是一个整数。我不明白为什么它在尝试调用my_prod
之前没有传递实际的integer
,就像对Sum
的情况一样。在
当
Product
的极限是预先知道的您可以通过调用
.doit()
将Product
扩展到其组件部分来解决此问题:例如
^{pr2}$印刷品
但是,如果您将}或{}(取决于您的操作系统)和产品
.doit()
与sy.Product(x[i], (i, 1, 100))
一起使用,那么您将得到一个算术溢出,因为np.arange(101)
具有{100!
太大,不能存储在
int32
或int64
数组值中。在因此
引发
并错误地打印
0
。在如果将输入从dtype
int64
数组更改为Pythonint
的列表,则 可以正确计算产品:印刷品
当
Product
的极限是不是预先知道的周围的工作 (非洲)变得更加复杂。如果使用调试器跟踪代码路径 当使用}
调用以将
Sum
时,您会发现 ^{Sum(x[i], (i, 0, n))
转换为表达式builtins.sum(x[i] for i in range(0, n+1))
。在如果我们将
_print_Product
方法添加到NumPyPrinter
(一个LambdaPrinter
的子类), 然后我们可以得到lambdify
来成功地将Product
转换成NumPy可以计算的表达式:印刷品
相关问题 更多 >
编程相关推荐