【问题标题】:Python-Integrate then save text filePython-集成然后保存文本文件
【发布时间】:2011-11-01 18:31:24
【问题描述】:

致大家:

这个问题与我正在做的一些 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)

当我运行它时,我收到以下错误:

文件“integral.py”,第 19 行,在 savetxt('int.txt', int) 文件“/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/numpy/lib/npyio.py”,第 960 行,在 savetxt ncol = X.shape[1] IndexError:元组索引超出范围

我这几天一直在尝试解决这个问题,但我还没有找到解决方案。感谢您提供的任何帮助/cmets。

【问题讨论】:

  • int = trapz(data[i,:],axis=0) 中你的意思是用data[i:] 而不是data[i,:]
  • 另外,将变量命名为标准类型之一 (int) 可能是个坏主意。

标签: python numpy


【解决方案1】:

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) * (y 2 + y1) / 2 最终的积分结果是所有这些区域的总和)。

合并这些 x 轴值的最简单方法是将其作为x 参数传递给trapz 函数(请参阅docstring)。在上面的例子中,我使用t = data[0,:] 作为 x 值的数组。

另一个警告:如果 x 值之间的所有间距都相同(因此 x2 - x1 是一个常数),您可以通过拉动来节省一些计算这从总和中得出,并在最后简单地相乘。此功能可通过带有dx 参数的trapz 函数获得。因此,例如,如果您每 30 秒进行一次时间测量,您可以将我的第二个示例中的第二行替换为:

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

希望对您有所帮助。

【讨论】:

  • 非常感谢大家的建议。威尔,你能解释一下你写的最后一段代码吗?我不确定你的意思。 @威尔
  • 非常感谢您的帮助!我没有很好地提出我的问题。事实上,我只是整合每次的音量而不是时间。即到 1.0s 我有一系列代表水面高度的值,然后对于 1.5s 我有一系列新的值代表一个新的表面配置。我正在接受这些价值观,然后看看你在整个时间里是如何变化的。非常感谢您花时间回答这个问题。
猜你喜欢
  • 2013-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-11
  • 1970-01-01
  • 2018-06-03
  • 1970-01-01
相关资源
最近更新 更多