Добавление значений из текстового файла в массив в python

#python #arrays #function #numpy #user-defined-functions

#python #массивы #функция #numpy #определяемые пользователем функции

Вопрос:

У меня есть эта программа, которая вычисляет приближение к производной от sin(pi / 3). Печать выдает этот вывод в текстовый файл:

 delta_x: 1.000000e-01, df_approx: 4.5590188541e-01, df_exact: 5.0000000000e-01, abs_error: 4.409811e-02,           rel_error: 8.819623e-02, n=1
delta_x: 1.000000e-02, df_approx: 4.9566157577e-01, df_exact: 5.0000000000e-01, abs_error: 4.338424e-03,           rel_error: 8.676848e-03, n=2
delta_x: 1.000000e-03, df_approx: 4.9956690400e-01, df_exact: 5.0000000000e-01, abs_error: 4.330960e-04,           rel_error: 8.661920e-04, n=3
delta_x: 1.000000e-04, df_approx: 4.9995669790e-01, df_exact: 5.0000000000e-01, abs_error: 4.330210e-05,           rel_error: 8.660421e-05, n=4
delta_x: 1.000000e-05, df_approx: 4.9999566987e-01, df_exact: 5.0000000000e-01, abs_error: 4.330133e-06,           rel_error: 8.660266e-06, n=5
delta_x: 1.000000e-06, df_approx: 4.9999956697e-01, df_exact: 5.0000000000e-01, abs_error: 4.330281e-07,           rel_error: 8.660562e-07, n=6
delta_x: 1.000000e-07, df_approx: 4.9999995699e-01, df_exact: 5.0000000000e-01, abs_error: 4.300676e-08,           rel_error: 8.601353e-08, n=7
delta_x: 1.000000e-08, df_approx: 4.9999999696e-01, df_exact: 5.0000000000e-01, abs_error: 3.038736e-09,           rel_error: 6.077471e-09, n=8
delta_x: 1.000000e-09, df_approx: 5.0000004137e-01, df_exact: 5.0000000000e-01, abs_error: 4.137019e-08,           rel_error: 8.274037e-08, n=9
delta_x: 1.000000e-10, df_approx: 5.0000004137e-01, df_exact: 5.0000000000e-01, abs_error: 4.137019e-08,           rel_error: 8.274037e-08, n=10
delta_x: 1.000000e-11, df_approx: 5.0000004137e-01, df_exact: 5.0000000000e-01, abs_error: 4.137019e-08,           rel_error: 8.274037e-08, n=11
delta_x: 1.000000e-12, df_approx: 5.0004445029e-01, df_exact: 5.0000000000e-01, abs_error: 4.445029e-05,           rel_error: 8.890058e-05, n=12
delta_x: 1.000000e-13, df_approx: 4.9960036108e-01, df_exact: 5.0000000000e-01, abs_error: 3.996389e-04,           rel_error: 7.992778e-04, n=13
delta_x: 1.000000e-14, df_approx: 4.9960036108e-01, df_exact: 5.0000000000e-01, abs_error: 3.996389e-04,           rel_error: 7.992778e-04, n=14
delta_x: 1.000000e-15, df_approx: 5.5511151231e-01, df_exact: 5.0000000000e-01, abs_error: 5.511151e-02,           rel_error: 1.102230e-01, n=15
delta_x: 1.000000e-16, df_approx: 0.0000000000e 00, df_exact: 5.0000000000e-01, abs_error: 5.000000e-01,           rel_error: 1.000000e 00, n=16
delta_x: 1.000000e-17, df_approx: 0.0000000000e 00, df_exact: 5.0000000000e-01, abs_error: 5.000000e-01,           rel_error: 1.000000e 00, n=17
delta_x: 1.000000e-18, df_approx: 0.0000000000e 00, df_exact: 5.0000000000e-01, abs_error: 5.000000e-01,           rel_error: 1.000000e 00, n=18
delta_x: 1.000000e-19, df_approx: 0.0000000000e 00, df_exact: 5.0000000000e-01, abs_error: 5.000000e-01,           rel_error: 1.000000e 00, n=19
  

Теперь я хочу написать функцию, которая считывает файл и возвращает три массива, состоящие из чисел, соответствующих delta_x, abs_error и n . Как мне это сделать? Потому что мне нужно позже отобразить эти массивы в виде графика, но я не могу понять, как на самом деле извлечь нужные значения с помощью функции, которая возвращает массивы для каждого из значений, которые я рассчитал? Я пробовал с этим кодом, но получаю смешную печать:

 import numpy as np
import matplotlib.pyplot as plt

k=19 #number of calculations
abs_error=np.zeros(k)
n=np.zeros(k)
delta_x=np.zeros(k)

def extract_data(filename):
    infile = open('approx_derivative_sine.txt', 'r')

    for line in infile:
        words=line.split()
        #words[0]: delta_x, words[1]: value for delta_x
        np.append(delta_x, words[1])
        np.append(abs_error, words[7])
        np.append(n, words[10])
        
    return delta_x,abs_error,n

print(extract_data(0))
  

печать:

 (array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0.]), array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0.]), array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0.]))
  

Что совершенно неправильно, потому что предполагается, что каждый массив должен иметь значения с плавающей запятой из delta_x, abs_error и n, которые находятся в txt-файле. Когда я делаю это в виде списка, это работает, но мне приходится использовать массивы. У кого-нибудь есть идея, как это исправить? Может ли кто-нибудь написать работающий код???

Комментарии:

1. np.append это не список, добавляющий cline. Не используйте его таким же образом. А еще лучше не использовать его вообще.

2. как мне это исправить? что бы вы изменили

3. Как бы вы это переписали, я не понимаю, что вы имеете в виду

4. Вызовите интерактивный сеанс Python и опыт. При сборе данных из строк файла мы часто используем списки, начиная с [] и добавляя значения в каждой строке. Это простое кодирование на Python. Сохраните создание массива до конца.

5. Я не понимаю @hpaulj, можете ли вы объяснить дальше?