致所有人:
这个问题与我正在做的一些MS研究有关。
我想做的事情看似简单。我有一个值的文本文件(时间,.....值)。然后我想要从0到这些值的所有时间进行整合,然后将该值保存到文本文件中。
from numpy import *
from pylab import *
import os, sys, shutil
import math
#######################
#Load Data
data = loadtxt('wh.txt')
#Open file to save plots to
shutil.rmtree("wh_files")
os.makedirs("wh_files")
os.chdir("wh_files")
for i in range(0,100,1):
int = trapz(data[i,:],axis=0)
print int
savetxt('int.txt', int)
当我运行时,我收到以下错误:
File "integral.py", line 19, in savetxt('int.txt', int) File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/numpy/lib/npyio.py", line 960, in savetxt ncol = X.shape[1] IndexError: tuple index out of range
我一直试图解决这个问题几天,但我还没有找到解决方案。我感谢您提供的任何帮助/意见。
答案 0 :(得分:2)
int
的值是浮点数,但savetxt
需要数组。您想为所有集成结果创建一个numpy数组,然后使用savetxt
将其保存到最后。我觉得这样的事情可以解决问题:
int_array = apply_along_axis(trapz, 0, data)
savetxt('int.txt', int_array)
请记住,这(与原始示例一起)将对时间字段求和,而不是跨时间积分。如果沿x轴的间距为1,这只会产生有效的结果。否则你会想做这样的事情:
t = data[0,:]
int_array = apply_along_axis(trapz, 0, data[1:,:], t)
savetxt('int.txt', int_array)
假设时间字段是数字。
编辑:第二段代码的详细说明如下。
您正在使用梯形规则来积分各种值,这是一种积分近似技术,它通过将曲线上连续y值的平均值乘以两个y值之间的x变化来求解。这相当于计算连接两个y值和x轴的梯形的面积,如下所示:
从您的问题中并不完全清楚,但似乎您正在整合这些值,因此x轴代表时间。需要合并x值以获得每个梯形的正确面积(每个梯形的面积为(x 2 - x 1 )*(y 2 + y 1 )/ 2,最终积分结果是所有这些区域的总和)。
合并这些x轴值的最简单方法是将其作为trapz
参数传递到x
函数中(请参阅docstring)。在上面的示例中,我使用t = data[0,:]
作为x值的数组。
另一个警告:如果x值之间的所有间距相同(因此x 2 - x 1 是常量),您可以通过拉动来节省一些计算这个总和,只是在最后乘以它。通过trapz
函数和dx
参数可以使用此功能。因此,例如,如果您每30秒进行一次测量,则可以将第二个示例中的第二行替换为:
int_array = apply_along_axis(trapz, 0, data[1:,:], None, 30)
希望有所帮助。