集成一个返回矩阵numpy的函数

时间:2017-06-03 17:20:30

标签: python numpy

我想做类似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]

2 个答案:

答案 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无圈样式的商品。