计算数据集范围中积分的最有效方法

时间:2011-01-11 19:50:56

标签: integration scipy

我有一个10行乘20列的数组。每列对应一个不能与任何类型的连续数学函数拟合的数据集(它是一系列通过实验得出的数字)。我想计算第4行和第8行之间每列的积分,然后将获得的结果存储在一个新数组(20行x 1列)中。

我尝试使用不同的scipy.integrate模块(例如quad,trpz,...)。

问题是,根据我的理解,scipy.integrate必须应用于函数,我不知道如何将我的初始数组的每一列转换为函数。作为替代方案,我想到计算第4行和第8行之间每列的平均值,然后将这个数乘以4(即8-4 = 4,x-间隔),然后将其存储到我的最终20x1数组中。问题是......呃...我不知道如何计算给定范围内的平均值。我问的问题是:

  1. 哪种方法更有效/更直接?
  2. 可以通过我所描述的数据集计算积分吗?
  3. 如何计算一系列行的平均值?

2 个答案:

答案 0 :(得分:4)

由于您只知道数据点,因此最好的选择是使用trapz(基于您知道的数据点对积分的梯形近似)。

您很可能不希望将数据集转换为函数,而使用trapz则不需要。

所以,如果我理解正确,你想做这样的事情:

from numpy import *

# x-coordinates for data points
x = array([0, 0.4, 1.6, 1.9, 2, 4, 5, 9, 10])

# some random data: 3 whatever data sets (sharing the same x-coordinates)
y = zeros([len(x), 3])
y[:,0] = 123
y[:,1] = 1 + x
y[:,2] = cos(x/5.)
print y

# compute approximations for integral(dataset, x=0..10) for datasets i=0,1,2
yi = trapz(y, x[:,newaxis], axis=0)
# what happens here: x must be an array of the same shape as y
# newaxis tells numpy to add a new "virtual" axis to x, in effect saying that the
# x-coordinates are the same for each data set

# approximations of the integrals based the datasets
# (here we also know the exact values, so print them too)
print yi[0], 123*10
print yi[1], 10 + 10*10/2.
print yi[2], sin(10./5.)*5.

答案 1 :(得分:2)

要获得每列中条目4到8(包括两端)的总和,请使用

a = numpy.arange(200).reshape(10, 20)
a[4:9].sum(axis=0)

(第一行只是创建一个所需形状的示例数组。)