【问题标题】:Integrate a function that returns a matrix numpy集成一个返回矩阵numpy的函数
【发布时间】:2017-06-03 17:20:29
【问题描述】:

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

【问题讨论】:

  • 那么想要的结果与使用不同的ij 值执行6 次quad 相同吗?作为参考,请向我们展示如何使用显式循环来执行此操作。
  • 是的@hpaulj 这就是想要的结果。

标签: python numpy


【解决方案1】:

通过lambda 传递i,j 的替代方法是使用quadargs 参数:

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 函数)应用于一系列函数或参数。但假设您想为 quad 提供集成步骤等方面的全部权力,那么迭代是无可替代的。

【讨论】:

    【解决方案2】:

    你想要的可以通过这种方式实现:

    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 加速。它只是模仿 numpy 无环样式的商品。

    【讨论】:

      猜你喜欢
      • 2013-06-08
      • 1970-01-01
      • 2021-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-19
      • 1970-01-01
      相关资源
      最近更新 更多