Загрузка данных из файла и их визуализация
Итак, мы собрали данные с термопары и записали их в файл alpha.txt. Чтение файла и визуализация данных не представляет проблемы, но способ обработки списков имеет свои особенности.
Первый вариант программы:
Для упрощения работы с файлом здесь использована конструкция with , которая корректно отрабатывает открытие и закрытие файла.
Для упрощения работы с файлом здесь использована конструкция with , которая корректно отрабатывает открытие и закрытие файла.
Для того чтобы корректно отобразить данные на графике, нам нужно взять второй и третий столбцы списка. Не используя библиотеку numpy , вырезать столбец из data можно так, как показано в строках 11 и 12, для этого потребовалось создать дополнительные списки X и Y.
Второй вариант программы с использованием библиотеки numpy :
Как видим, программа существенно упростилась, однако следует обратить внимание на строку 4: импорт данных с помощью метода genfromtxt осуществляется в структурированный массив с именованными столбцами, при этом имена столбцов и тип данных указывается в списке значений параметра dtype . В случае, если тип не указан, он будет определяться по введённым значениям. Результат записывается в массив data , но структура этого массива отличается от списка предыдущей программы. В этой связи, для вывода графика в методе plot достаточно указать имя столбца в массиве data для выбора необходимых срезов матрицы (строка 7).
Третий вариант программы с использованием библиотеки pandas:
Библиотека pandas предполагает использовать специальные алгоритмы обработки и анализа больших данных.
Следующая тема
Комментарии
Если вы заметили неточность, ошибку или хотите поделиться своими мыслями по поводу статьи — мы рады обратной связи. Давайте вместе сделаем ресурс лучше!
Чтение матрицы из файла.
Здравствуйте! Мне нужно прочитать матрицу из файла input.txt на языке python3. Матрица состоит из char’ов и вот ее пример:
A A . B B . A . . B A A . . B A . . . B A A . B B на вход еще подаются два числа n*m (размерность матрицы) Пробовал гуглить . Ничего не нашел. Кто знает как реализовать чтение матрицы пожалуйста помогите.

levon12341
08.10.16 12:23:09 MSK
подписался, тоже интересно.. сталкнулся с такой же проблемой когда вдруг оказалось нужно прочитать матрицу из файла и ни как.
anonymous
( 08.10.16 12:31:44 MSK )
Ответ на: комментарий от anonymous 08.10.16 12:31:44 MSK

ты больной ублюдок если не знаешь не пиши
levon12341
( 08.10.16 12:34:13 MSK ) автор топика
Ответ на: комментарий от anonymous 08.10.16 12:31:44 MSK

Подписавшийся анонимус. Смотри в личке решение.
greenman ★★★★★
( 08.10.16 12:34:16 MSK )
Ответ на: комментарий от greenman 08.10.16 12:34:16 MSK

скинешь мне решение??
levon12341
( 08.10.16 12:36:02 MSK ) автор топика

Vovanano ★
( 08.10.16 12:36:18 MSK )
Ответ на: комментарий от greenman 08.10.16 12:34:16 MSK
Спасибо, для моих задач подходит. Кинул 30$ на кошелёк, как договаривались.
anonymous
( 08.10.16 12:37:07 MSK )
Ответ на: комментарий от greenman 08.10.16 12:34:16 MSK
да, спасибо! решение работает! матрицы прямо НА_УРА теперь читаются!
только исправил xrange на range — в тройке его нет
anonymous
( 08.10.16 12:37:40 MSK )
Ответ на: комментарий от levon12341 08.10.16 12:36:02 MSK
anonymous
( 08.10.16 12:39:26 MSK )

Читай по строкам, пользуйся .split() для разделения по пробелам.
evilface ★★
( 08.10.16 13:05:00 MSK )

Для начала считай файл в массив текстовых строк.
Затем по формуле s = (2*m)-1 ты получишь позицию символа в строке.
Но лучше сделай следующим образом. Могу показать пример на gambas, но думаю для питона ты сможешь его адаптировать
Dim FileStrings As String[] ' Динамический массив строк Dim MATRIX As New Byte[][] ' Массив массивов. Двумерный массив для результата Dim a As Integer ' счётчик Dim b As Intrger Dim e As Intrger Dim m As Integer ' предел счётчика Dim sm As Integer ' предельная строка Dim t As String * 1 FileStrings = LoadDataTextFile() ' Загрузка строк из файла в массив MATRIX.Resize(FilesStrings.Count) ' Размер матрицы по количеству строк sm = MATRIX.Max For a=0 To sm Matrix[a] = New Byte[] m = Len(FileStrings[a]) Matrix[a].Resize(m/2) b = 1 For e=0 To Matrix[a].Max MATRIX[a][e] = Asc(Mid(FileStrings[a],b,1)) b=b+2 Next Next
Чтение матрицы из .txt файла

Мой код:
with open('m.txt') as file: file = file.read() q = file.replace(' ', '') # убираю лишние пробелы f1 = q[0:8] # в переменную f1 сохраняю первую строку f2 = q[9:16] # в f2 - вторую строку f3 = q[17:24] f4 = q[25:32] f5 = q[33:40] f6 = q[41:48]
В правильном ли я направлении иду и как быть дальше?
Отслеживать
12.5k 7 7 золотых знаков 18 18 серебряных знаков 48 48 бронзовых знаков
задан 28 окт 2018 в 14:29
309 2 2 золотых знака 9 9 серебряных знаков 18 18 бронзовых знаков
f = open(‘m.txt, ‘r’) matrix = [line.replace(«\n», «»).split() for line in f]
28 окт 2018 в 14:34
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
1 2 3 4 5 6 7 8 8 7 9 6 5 4 1 2 1 2 0 1 4 8 7 5 4 5 2 3 6 9 8 7 0 1 2 3 0 1 2 5 2 1 4 5 6 9 8 7 1 2 5 4 7 8 5 2 10 1 2 4 5 6 9 8
In [5]: with open('matrix.txt') as f: . matrix = [list(map(int, row.split())) for row in f.readlines()] . In [6]: matrix Out[6]: [[1, 2, 3, 4, 5, 6, 7, 8], [8, 7, 9, 6, 5, 4, 1, 2], [1, 2, 0, 1, 4, 8, 7, 5], [4, 5, 2, 3, 6, 9, 8, 7], [0, 1, 2, 3, 0, 1, 2, 5], [2, 1, 4, 5, 6, 9, 8, 7], [1, 2, 5, 4, 7, 8, 5, 2], [10, 1, 2, 4, 5, 6, 9, 8]] In [7]: matrix.reverse() In [8]: matrix Out[8]: [[10, 1, 2, 4, 5, 6, 9, 8], [1, 2, 5, 4, 7, 8, 5, 2], [2, 1, 4, 5, 6, 9, 8, 7], [0, 1, 2, 3, 0, 1, 2, 5], [4, 5, 2, 3, 6, 9, 8, 7], [1, 2, 0, 1, 4, 8, 7, 5], [8, 7, 9, 6, 5, 4, 1, 2], [1, 2, 3, 4, 5, 6, 7, 8]]
Ну и запись в другой файл соответственно:
In [14]: with open('output.txt', 'w') as f: . for row in matrix: . f.write(' '.join(map(str, row)) + '\n')
Считываем числовые данные из файла на Python
В данной статье речь пойдет о простой на первой взгляд задаче — считывании числовых данных из текстовых файлов на Python. В сети можно найти десятки способов решения этой задачи, однако эти алгоритмы оказываются малоэффективными при работе с большим объемом данных. В данной статье будут разобраны самые популярные методики, а также произведено сравнение их скорости работы.
Введение
Когда я только начинал изучать Python, главным помощником в работе для меня, как наверное и для большинства программистов, был Stack Overflow. Я почерпнул оттуда много полезной информации, в том числе и о работе с файлами. Однако даже такая тривиальная задача, как оказалось, имеет несколько различных решений, отличающихся друг от друга простотой реализации и скоростью работы.
Большинство предложенных методов предполагают чтение файла построчно с дальнейшим разбиением на блоки и их преобразованием из строкового типа в числовой, поскольку Python в отличии от C/C++ работает с файлами как с массивом строк. Выполнить последовательное чтение данных в массив без преобразования типов, как это можно сделать в C/C++, стандартными средствами языка невозможно (насколько мне известно), и это существенно увеличивает время работы программы при обработке больших объемов данных.
Способы чтения данных из файла
Как уже было сказано выше, файлы в Python представляют собой массив строк, поэтому все найденные методы можно символически поделить на два типа в зависимости от используемого подхода:
- построчное считывание с разбиением и преобразованием типов
- использование библиотек, которые средствами других языков (например, C/C++) считывают файл и передают полученные данные интерпретатору Python
Ниже представлена подборка самых популярных методов чтения числовых данных на Python, отмеченных сообществом Stack Overflow как «best answer».
Способ 1 — построчное считывание с преобразованием
Самый популярный и простой вариант. Заключается в построчном чтении с разбиением полученной строки на блоки, которые затем преобразуются к необходимому типу данных (в данном случае float) и добавляются к заранее созданному списку.
data = [] with open("data.txt") as f: for line in f: data.append([float(x) for x in line.split()])
Способ 2 — преобразование при помощи map
Способ аналогичен предыдущему, за исключением того, что преобразованием данных из строкового формата в числовой занимается функция map.
file = open("data.txt", "r") data = [map(float, line.split("\t")) for line in file]
Способ 3 — с использованием регулярного выражения
Данный способ можно назвать стрельбой из пушки по воробьям, однако у него все же есть свои плюсы: если данные в файле расположены хаотично и отсутствует постоянная структура, то функции split невозможно задать конкретный разделитель и для решения задачи можно использовать регулярное выражение, которое найдет в строке все числа, несмотря на их расположение и наличие разделителей.
import re file = open("data.txt") values = file.read().split("\n") data = [] for key in values: value = re.findall(r"[-+]?\d*\.\d+|\d+", key) if value != []: data.append(value)
Способ 4 — с использованием CSV Reader
Если данные записаны в виде матрицы с постоянными разделителями, то выполнить их чтение можно при помощи модуля CSV Reader, указав в качестве параметра значение разделителя.
import csv with open("data.txt") as f: data = [map(float, row) for row in csv.reader(f, delimiter='\t')]
Способ 5 — Numpy loadtxt
Библиотека Numpy предоставляет широкий набор модулей и функций для обработки числовых данных, в том числе и для чтения массивов из файлов. Одна из реализаций возможна с помощью функции loadtxt, результат работы которой будет записан в numpy.array.
import numpy as np data = np.loadtxt("data.txt", delimiter='\t', dtype=np.float)
Способ 6 — Numpy genfromtxt
Данный способ не сильно отличается от предыдущего, за исключением того, что genfromtxt предоставляет более широкий набор входных параметров: указание различных типов данных для каждого из столбцов, передача ключей для создания ассоциативного массива и так далее.
import numpy as np data = np.genfromtxt("data.txt", delimiter='\t', dtype=np.float)
Способ 7 — Pandas read_csv
Pandas — мощная библиотека для обработки данных на Python. В данном примере рассматривается только чтение данных, но её возможности этим не ограничены. Метод read_csv предоставляет широкий набор входных параметров, а также показывается высокую скорость работы даже при работе с большими объемами данных.
import pandas as pd data = pd.read_csv("data.txt", sep="\t", header=None)
Методы тестирования скорости чтения
Для тестирования скорости чтения числовых данных были сгенерированы 7 тестовых файлов, содержащих 5 столбцов и 10, 100, 1 000, 10 000, 100 000, 1 000 000 и 10 000 000 строк случайных чисел формата float. Размер самого большого файла составил 742 Мб.
Для измерения времени работы программы использовалась функция time. Существует мнение, что измерять с её помощью время работы некорректно. Однако в данном случае меня интересовало работа с большими объемами данных, когда время работы программы составляло несколько десятков секунд. В таком случае отклонение в полсекунды вносило погрешность менее 1%.
Сравнение с компилируемыми языками программирования
Программы, созданные на компилируемых языках программирования, работают быстрее, чем их аналоги, написанные на интерпретируемых языках. Мне было интересно сравнить скорость чтения каждого метода с Fortran и C++ — самыми популярными языками в научном программировании, с которыми мне также приходится иметь дело в силу специфики моей работы.
Fortran
Несмотря на то, что Fortran считается устаревшим языком, он все еще очень популярен в научном программировании благодаря простоте написания кода, скорости обмена данных и обширном количестве библиотек, созданных за последние полвека.
Например, считать числовую матрицу из файла можно всего за 3 строчки кода при условии корректности входных данных.
real, dimension (5, 1000) :: data open (1, file='data.txt') read(1, *) data
C++
Дискуссии о том, что лучше: Fortran или C++ ведутся уже давно, даже среди авторов EasyCoding этот спор возникал несколько раз, поэтому мне было еще интересней протестировать чтение матриц на данном языке.
ifstream file(«data.txt»); int count = 100000; float** data = new float*[count]; for(int i = 0; i
Результаты тестирования
В ходе эксперимента были протестированы 7 программ на языке Python и по одной на Fortran и C++, код которых представлен выше. Запуск программ осуществлялся на компьютере с Intel Core i5 2.7 GHz и 8 Гб оперативной памяти.
Для запуска программ использовались следующие интерпретаторы и компиляторы:
- Python 3.5.2
- GNU Fortran (GCC) 6.1.0
- g++ 4.2.1
Для каждой программы проводилась серия испытаний и измерялось время работы, после чего записывался результат в виде среднего арифметического полученных данных. В таблице ниже жирным в каждой строке выделено наименьшее время работы в зависимости от способа чтения и размера входного файла.
| Число строк | Способ | ||||||||
|---|---|---|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Fortran | C++ | |
| 10 | 0.048 | 0.048 | 0.045 | 0.044 | 0.173 | 0.216 | 0.479 | 0.005 | 0.005 |
| 100 | 0.053 | 0.052 | 0.05 | 0.048 | 0.185 | 0.223 | 0.511 | 0.007 | 0.006 |
| 1 000 | 0.056 | 0.053 | 0.053 | 0.052 | 0.187 | 0.233 | 0.6 | 0.01 | 0.01 |
| 10 000 | 0.085 | 0.076 | 0.096 | 0.083 | 0.305 | 0.292 | 0.636 | 0.032 | 0.041 |
| 100 000 | 0.414 | 0.403 | 0.561 | 0.482 | 1.537 | 0.874 | 0.796 | 0.244 | 0.363 |
| 1 000 000 | 3.835 | 4.502 | 6.086 | 5.276 | 13.607 | 6.754 | 1.763 | 2.584 | 3.662 |
| 10 000 000 | 47.931 | 156.944 | 137.398 | 144.75 | 162.724 | 85.642 | 13.632 | 25.652 | 36.622 |
Итог
В ходе данного исследования были протестированы 7 самых популярных варианта чтения числовых матриц на языке Python, предложенными пользователями сайта Stack Overflow и отмеченными сообществом как «верный ответ». Как видно из таблицы с результатами, скорость работы программ не сильно отличается при использовании способов 1-4 на небольших объемах данных. Это связано с тем, что интерпретатор не тратит время на инициализацию сторонней библиотеки, как в методах 5-7.
Однако при увеличении объема входных данных лучше всех себя показал метод 7 с использованием библиотеки Pandas, который даже обогнал по скорости чтения данных языки C++ и Fortran.
Также из результатов теста можно видеть, что программа на Fortran справилась с чтением данных быстрей аналога на C++, что еще раз доказывает его превосходство над самым популярным языком программирования в мире.
10 commentaries to post
Наконец, нашел, что искал. Способ 6 — Numpy genfromtxt, который предоставляет более широкий набор входных параметров: указание различных типов данных для каждого из столбцов, передача ключей для создания ассоциативного массива и так далее.
Спасибо. Сэкономили время на поиск единственного, что нужно для моих вычислений по таблице «тексты-слова»…
ошибка в таблице ! 0.044 не меньше чем 0.005 а больше почти в 9 раз!
nightflash :
Нет ошибки. Автор сравнивал скорости Python решений.
С++, который обгонит всё перечисленное:
FILE* f = fopen(«data.txt», «rb») int count = 10000; float** data = new float*[count]; for(int i = 0; i < count; ++i)
Причем не особо кошерная реализация. Но соответствует предоставленному коду.
Кошерная реализация это:
fread(data, sizeof(float) * 5 * count, f);
