我想做类似this question的事情。
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的int。如果我考虑其中一个答案:
>>> 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 :(得分:2)
通过i,j
传递lambda
的替代方法是使用args
的{{1}}参数:
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 :(得分: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无圈样式的商品。