Python-整合后保存文本文件

0 投票
1 回答
3170 浏览
提问于 2025-04-17 05:11

大家好:

这个问题和我正在做的一些微软研究有关。

我想做的事情看起来很简单。我有一个文本文件,里面有一些数值(时间,……其他数值)。然后我想对这些数值从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

我已经尝试了几天来解决这个问题,但还没有找到办法。非常感谢你们能提供的任何帮助或建议。

1 个回答

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 值纳入计算,以获得每个梯形的正确面积(每个梯形的面积是 (x2 - x1) * (y2 + y1) / 2,最终的积分结果是所有这些面积的总和)。

将这些 x 轴值纳入计算的最简单方法是将它传递给 trapz 函数作为 x 参数(可以查看 文档)。在上面的例子中,我使用 t = data[0,:] 作为 x 值的数组。

还有一个注意事项:如果所有 x 值之间的间隔都是相同的(这样 x2 - x1 是一个常数),你可以通过将这个常数提取出来,省去一些计算,最后直接相乘。这种功能可以通过 trapz 函数的 dx 参数来实现。所以,如果你的时间测量是每 30 秒进行一次,比如说,你可以将我第二个例子中的第二行替换为:

int_array = apply_along_axis(trapz, 0, data[1:,:], None, 30)

希望这能帮到你。

撰写回答