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]
我想做一些很简单的事情,但我无法在 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]