#python #numpy
#python #numpy
Вопрос:
Для всех:
Этот вопрос относится к некоторым исследованиям 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.форма[1] Ошибка индекса: индекс кортежа выходит за пределы диапазона
Я пытался решить эту проблему в течение нескольких дней, но мне еще предстоит найти решение. Я ценю любую помощь / комментарии, которые вы можете дать.
Комментарии:
1. В
int = trapz(data[i,:],axis=0)
вы имели в виду иметьdata[i:]
вместоdata[i,:]
?2. Кроме того, иметь переменную с именем, подобным одному из стандартных типов (
int
), вероятно, является плохой идеей.
Ответ №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)
Предполагая, что поля времени являются числовыми.
редактировать: далее следует объяснение 2-го раздела кода.
Вы используете трапециевидное правило для интеграции различных значений, которое представляет собой метод интегральной аппроксимации, который работает путем суммирования среднего значения последовательных значений y на кривой, умноженного на изменение x между двумя значениями y. Это равносильно вычислению площади трапеции, которая соединяет два значения y и ось x, вот так:
Из вашего вопроса не совсем понятно, но казалось, что вы интегрировали значения во времени, чтобы ось x представляла время. Необходимо включить значения x, чтобы получить правильную площадь каждой трапеции (площадь каждой трапеции равна (x 2 — x 1) * (y 2 y 1) / 2, а конечный результат интеграции является суммой всех таких площадей).
Самый простой способ включить эти значения по оси x — передать их в trapz
функцию в качестве x
параметра (см. Строку документации). В приведенном выше примере я использовал t = data[0,:]
в качестве массива значения x так.
Еще одно предостережение: если все интервалы между значениями x одинаковы (так что x 2 — x 1 является константой), вы можете сэкономить некоторые вычисления, вычеркнув это из суммирования и просто умножив его в конце. Эта функциональность доступна через trapz
функцию с dx
параметром. Итак, если измерения времени проводились каждые 30 секунд, например, вы могли бы заменить 2-ю строку в моем 2-м примере на:
int_array = apply_along_axis(trapz, 0, data[1:,:], None, 30)
Надеюсь, это поможет.
Комментарии:
1. Большое вам всем спасибо за совет. Уилл, ты можешь объяснить последний фрагмент кода, который ты написал? Я не уверен, что вы имеете в виду. @Will
2. Большое спасибо за помощь! Я не очень хорошо справился со своим вопросом. На самом деле я интегрирую объем только каждый раз, а не по времени. т. е. до 1,0 с у меня есть ряд значений, которые представляют высоту поверхности воды, затем в течение 1,5 с у меня есть новая серия значений, представляющих новую конфигурацию поверхности. Я беру эти значения, а затем вижу, как они меняются с течением времени. Я действительно ценю время, которое вы потратили на ответ на этот вопрос.