numpy 中的数字积分

Numeric integration in numpy

我想做一些很简单的事情,但我无法在 numpy 的深处找到它。我想对一个由其值给出的函数进行数值连续积分( 而不是 通过其公式!)。这意味着我只需要一个数组来保存输入数组开头的总和。示例:

输入:

[ 4, 3, 5, 8 ]

输出:

[ 4, 7, 12, 20 ]  # [ sum(i[0:1]), sum(i[0:2]), sum(i[0:3]), sum(i[0:4]) ]

听起来很简单,所以我希望这一定很容易,因为我目前无法找到一些 numpy 功能。

我发现了类似 scipy.integrate.quad() 的东西,但它似乎在给定范围内(从 a 到 b)整合,并且 returns 是一个单一值。我需要一个数组作为输出。

你只需要 numpy.cumsum().

import numpy as np
a = np.array([ 4, 3, 5, 8 ])
print np.cumsum(a) # prints [ 4  7 12 20]

您正在寻找 numpy.cumsum:

   >>> numpy.cumsum([ 4, 3, 5, 8 ])
   array([ 4,  7, 12, 20])

您可以使用 quadpy (pip install quadpy),这是我的一个项目,与 scipy.integrate.quad() 相反,它进行矢量化计算。给它提供很多区间,把这些区间内的所有积分值都取回来。

import numpy
import quadpy

a = 0.0
b = 3.0
h = 1.0e-2
n = int((b-a) / h)

x0 = numpy.linspace(a, b, num=n, endpoint=False)
x1 = x0 + h
intervals = numpy.stack([x0, x1])

vals = quadpy.line_segment.integrate(
        lambda x: numpy.sin(x),
        intervals,
        quadpy.line_segment.GaussLegendre(5)
        )

res = numpy.cumsum(vals)

import matplotlib.pyplot as plt
plt.plot(x1, numpy.sin(x1), label='f')
plt.plot(x1, res, label='F')
plt.legend()
plt.show()

您不需要 numpy 来获取输出。使用标准 itertools 我们得到以下内容:

from itertools import accumulate

a = [4, 3, 5, 8]
*b, = accumulate(a)
print(b) 

# [4, 7, 12, 20]