numpy 中的数字积分

Alf*_*lfe 0 python arrays numpy numerical-integration

我想做一些非常简单的事情,但我无法在numpy. 我想对一个由其值(而不是其公式!)给出的函数进行数值和连续积分。这意味着我只想要一个包含输入数组开头总和的数组。例子:

输入:

[ 4, 3, 5, 8 ]
Run Code Online (Sandbox Code Playgroud)

输出:

[ 4, 7, 12, 20 ]  # [ sum(i[0:1]), sum(i[0:2]), sum(i[0:3]), sum(i[0:4]) ]
Run Code Online (Sandbox Code Playgroud)

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

我发现了类似scipy.integrate.quad()但似乎在给定范围(从 a 到 b)内积分并返回单个值的东西。我需要一个数组作为输出。

Imp*_*est 7

你只需要numpy.cumsum().

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


sfj*_*jac 5

您正在寻找numpy.cumsum

   >>> numpy.cumsum([ 4, 3, 5, 8 ])
   array([ 4,  7, 12, 20])
Run Code Online (Sandbox Code Playgroud)


Nic*_*mer 5

您可以使用我的一个项目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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • @Nico你不能只编辑一个问题,这样你就可以写一个答案,其主要目标似乎是推广你的软件。 (2认同)