在numpy中的数值积分

3
我希望做一些相当简单的事情,但我无法在 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)进行积分,然后返回一个单一的值。我需要一个数组作为输出。


6
这个整合怎么样? - Arya McCarthy
1
啊,我知道了。对于未来的读者:这里是一个干扰函数的样子。然后我们使用黎曼和。 - Arya McCarthy
@aryamccarthy 你能详细解释一下为什么你不认为累积和是数值积分吗?我在这里看不出重点,而且你提供的链接也没有帮助。 - Alfe
1
数值积分是在给定定义域和函数的情况下近似计算积分的过程。由于您已经有了原函数,所以这个问题与数值积分无关。 - Nico Schlömer
2
@NicoSchlömer 你误解了。我没有可用的stemfunction;我想在过程中创建它。我的意思是它的值,而不是它的公式。因此需要进行积分。但你可以随意称呼它。 - Alfe
显示剩余2条评论
4个回答

10

您正在寻找numpy.cumsum

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

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

5
您可以使用我的项目 quadpypip 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()

enter image description here


不错!但实际上我只有一堆数字想要不断地求和(现在我知道np.cumsum()可以做到这一点)。然而,有人发现我的措辞(数值积分)太具有误导性了,以至于他从根本上重新表述了我的问题,最终看起来像是我在寻找函数。我撤销了那个(在我看来过于严格的)更改。我猜你的答案是在那段时间里给出的。 - Alfe
2
@Nico,你不能仅仅编辑一个问题以便你可以写一个答案,而这个答案的主要目的似乎是推广你的软件。 - ImportanceOfBeingErnest
@ImportanceOfBeingErnest 感谢您的回复。问题非常不清楚,特别是它与数值积分的联系;请参见原帖下面的讨论。从“我没有可用的干扰函数;我想在过程中创建它[...]”中,我得出结论,问题实际上就是关于这个的。我继续编辑了帖子,并经过一些调整给出了一个答案,即创建反导数的答案。我确实使用了我编写的包,但我不知道有什么问题。 - Nico Schlömer

1

您不需要使用 numpy 来获得输出结果。使用标准的 itertools,我们可以得到以下结果:

from itertools import accumulate

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

# [4, 7, 12, 20]

2
出于性能考虑,我正在使用 numpy。我正在对数百万个样本进行求和。当然,否则itertools方法也可能可行。 - Alfe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接