Python как загрузить матрицу из файла

от admin

Чтение матрицы из файла.

Здравствуйте! Мне нужно прочитать матрицу из файла input.txt на языке python3. Матрица состоит из char’ов и вот ее пример:

подписался, тоже интересно.. сталкнулся с такой же проблемой когда вдруг оказалось нужно прочитать матрицу из файла и ни как.

ты больной ублюдок если не знаешь не пиши

Подписавшийся анонимус. Смотри в личке решение.

скинешь мне решение??

Спасибо, для моих задач подходит. Кинул 30$ на кошелёк, как договаривались.

да, спасибо! решение работает! матрицы прямо НА_УРА теперь читаются!

только исправил xrange на range — в тройке его нет

Читай по строкам, пользуйся .split() для разделения по пробелам.

Для начала считай файл в массив текстовых строк.

Затем по формуле s = (2*m)-1 ты получишь позицию символа в строке.

Но лучше сделай следующим образом. Могу показать пример на gambas, но думаю для питона ты сможешь его адаптировать

Считываем числовые данные из файла на Python

В данной статье речь пойдет о простой на первой взгляд задаче — считывании числовых данных из текстовых файлов на Python. В сети можно найти десятки способов решения этой задачи, однако эти алгоритмы оказываются малоэффективными при работе с большим объемом данных. В данной статье будут разобраны самые популярные методики, а также произведено сравнение их скорости работы.

Введение

Когда я только начинал изучать Python, главным помощником в работе для меня, как наверное и для большинства программистов, был Stack Overflow. Я почерпнул оттуда много полезной информации, в том числе и о работе с файлами. Однако даже такая тривиальная задача, как оказалось, имеет несколько различных решений, отличающихся друг от друга простотой реализации и скоростью работы.

Большинство предложенных методов предполагают чтение файла построчно с дальнейшим разбиением на блоки и их преобразованием из строкового типа в числовой, поскольку Python в отличии от C/C++ работает с файлами как с массивом строк. Выполнить последовательное чтение данных в массив без преобразования типов, как это можно сделать в C/C++, стандартными средствами языка невозможно (насколько мне известно), и это существенно увеличивает время работы программы при обработке больших объемов данных.

Способы чтения данных из файла

Как уже было сказано выше, файлы в Python представляют собой массив строк, поэтому все найденные методы можно символически поделить на два типа в зависимости от используемого подхода:

  • построчное считывание с разбиением и преобразованием типов
  • использование библиотек, которые средствами других языков (например, C/C++) считывают файл и передают полученные данные интерпретатору Python

Ниже представлена подборка самых популярных методов чтения числовых данных на Python, отмеченных сообществом Stack Overflow как «best answer».

Способ 1 — построчное считывание с преобразованием

Самый популярный и простой вариант. Заключается в построчном чтении с разбиением полученной строки на блоки, которые затем преобразуются к необходимому типу данных (в данном случае float) и добавляются к заранее созданному списку.

Способ 2 — преобразование при помощи map

Способ аналогичен предыдущему, за исключением того, что преобразованием данных из строкового формата в числовой занимается функция map.

Способ 3 — с использованием регулярного выражения

Данный способ можно назвать стрельбой из пушки по воробьям, однако у него все же есть свои плюсы: если данные в файле расположены хаотично и отсутствует постоянная структура, то функции split невозможно задать конкретный разделитель и для решения задачи можно использовать регулярное выражение, которое найдет в строке все числа, несмотря на их расположение и наличие разделителей.

Способ 4 — с использованием CSV Reader

Если данные записаны в виде матрицы с постоянными разделителями, то выполнить их чтение можно при помощи модуля CSV Reader, указав в качестве параметра значение разделителя.

Способ 5 — Numpy loadtxt

Библиотека Numpy предоставляет широкий набор модулей и функций для обработки числовых данных, в том числе и для чтения массивов из файлов. Одна из реализаций возможна с помощью функции loadtxt, результат работы которой будет записан в numpy.array.

Способ 6 — Numpy genfromtxt

Данный способ не сильно отличается от предыдущего, за исключением того, что genfromtxt предоставляет более широкий набор входных параметров: указание различных типов данных для каждого из столбцов, передача ключей для создания ассоциативного массива и так далее.

Способ 7 — Pandas read_csv

Pandas — мощная библиотека для обработки данных на Python. В данном примере рассматривается только чтение данных, но её возможности этим не ограничены. Метод read_csv предоставляет широкий набор входных параметров, а также показывается высокую скорость работы даже при работе с большими объемами данных.

Методы тестирования скорости чтения

Для тестирования скорости чтения числовых данных были сгенерированы 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 строчки кода при условии корректности входных данных.

Дискуссии о том, что лучше: Fortran или C++ ведутся уже давно, даже среди авторов EasyCoding этот спор возникал несколько раз, поэтому мне было еще интересней протестировать чтение матриц на данном языке.

Результаты тестирования

В ходе эксперимента были протестированы 7 программ на языке Python и по одной на Fortran и C++, код которых представлен выше. Запуск программ осуществлялся на компьютере с Intel Core i5 2.7 GHz и 8 Гб оперативной памяти.

Для запуска программ использовались следующие интерпретаторы и компиляторы:

GNU Fortran (GCC) 6.1.0

Для каждой программы проводилась серия испытаний и измерялось время работы, после чего записывался результат в виде среднего арифметического полученных данных. В таблице ниже жирным в каждой строке выделено наименьшее время работы в зависимости от способа чтения и размера входного файла.

Число строк Способ
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 раз!

Нет ошибки. Автор сравнивал скорости Python решений.

С++, который обгонит всё перечисленное:

Причем не особо кошерная реализация. Но соответствует предоставленному коду.
Кошерная реализация это:

Спасибо за приведенное полезное сравнение. Не хватает сравнения скорости записи (в рам для точности)

К способу 6:
ModuleNotFoundError: No module named ‘numpy’
Ругается на import в начале

Необходимо установить соответствующую библиотеку numpy либо из репозиториев, либо посредством pip.

2 способ выдает:
[/, /, /]
при числах в файле:
1 2 3
4 5 6
7 8 9
Что не так?

Проверьте версию интерпретатора Python. В 3.7 работает нормально.

На С++ вы читали потоками, это медленно. Надо было попробовать функциями ввода вывода,fopen, fclose, fread должно быть быстрее. В С++ тоже несколько способов. Могло получиться сопоставимо с лучшим результатом.

Примеры работы с текстовыми файлами

В данной теме представлены примеры записи и чтения информации для текстовых файлов.

Содержание

  • 1. Чтение/запись списка, содержащего n целых чисел
  • 2. Чтение/запись списка, содержащего строки
  • 3. Чтение/запись кортежа, содержащего объекты чисел с плавающей запятой
  • 4. Чтение/запись кортежа содержащего разнотипные объекты
  • 5. Чтение/запись словаря
  • 6. Чтение/запись двумерной матрицы целых чисел, представленной в виде списка
  • 7. Чтение/запись множества, которое содержит целые числа
  • 8. Чтение/запись данных разных типов: список и кортеж

Поиск на других ресурсах:

1. Чтение/запись списка, содержащего n целых чисел

В примере демонстрируются следующие операции:

  • создание списка из 10 случайных чисел;
  • сохранение списка в текстовом файле;
  • чтение из файла в новый список с целью контроля.

Текст программы следующий:

Результат работы программы

2. Чтение/запись списка, содержащего строки

При чтении/записи строк не нужно реализовывать дополнительные преобразования из одного типа в другой, так как данные из файла читаются в виде строк.

Результат работы программы

3. Чтение/запись кортежа, содержащего объекты чисел с плавающей запятой

Пример демонстрирует запись и чтение кортежа, который содержит объекты чисел с плавающей запятой.

Результат работы программы

Вид файла myfile5.txt

4. Чтение/запись кортежа содержащего разнотипные объекты

В случае, если кортеж содержит объекты разных типов при записи/чтении важно придерживаться последовательности этапов конвертирования объектов в нужный тип. Ниже приведен пример записи и чтения кортежа, который содержит объекты целого, логического и строчного типов.

Результат выполнения программы

5. Чтение/запись словаря

Словарь также можно записывать в файл. В данном примере записывается и читается словарь, который содержит перечень номеров дней недели и их названий. Для облегчения чтения данных каждый элемент словаря размещается в отдельной строке.

Результат работы программы

Вид файла myfile6.txt

6. Чтение/запись двумерной матрицы целых чисел, представленной в виде списка

В примере демонстрируется запись и чтение двумерной матрицы целых чисел размерностью 3*4.

Результат работы программы

Вид файла myfile8.txt

7. Чтение/запись множества, которое содержит целые числа

В примере демонстрируется возможный вариант сохранения множества в текстовом файле

Результат работы программы

Вид файла myfile7.txt

8. Чтение/запись данных разных типов: список и кортеж

Чтобы записать в текстовый файл данные разных базовых типов нужно последовательно записать данные одного типа, затем другого типа. При считывании таких данных нужно придерживаться такого самого порядка чтобы не нарушить полученную структуру данных.

В примере демонстрируется последовательная запись в файл списка и кортежа. При чтении придерживается такая же последовательность: сначала читается список, затем кортеж. Список включает строки. Кортеж содержит вещественные числа. Чтобы облегчить работу по распознаванию формата файла, каждый записываемый (читаемый) элемент размещается в отдельной строке файла.
Поскольку список и кортеж могут содержать разное количество элементов, то в файл записываются их размерности.

6. Файловый ввод и вывод массивов

Занимаясь научными вычислениями, вы получаете результаты, которые должны быть обязательно сохранены. Самый надежный способ хранения — это загрузка массивов с результатами в файл, так как их легко хранить и передавать. Для данных нужд, NumPy предоставляет очень удобные инструменты, позволяющие производить загрузку и выгрузку массивов в файлы различных форматов, а так же производить их сжатие, необходимое для больших массивов.

6.1. Двоичные файлы NumPy (.npy, .npz)

NumPy имеет два собственных формата файлов .npy — для хранения массивов без сжатия и .npz — для предварительного сжатия массивов. Если массивы, которые необходимо сохранить являются небольшими, то можно воспользоваться функцией numpy.save() . В самом простом случае, данная функция принимает всего два аргумента — имя файла в который будет сохранен массив и имя самого сохраняемого массива. Однако следует помнить, что файл будет сохранен, в той директории в которой происходит выполнение скрипта Python или в указанном месте:

После того как массив сохранен, его можно загрузить из файла с помощью функции numpy.load() , указав в виде строки имя необходимого файла, если он находится в той же директории, что и выполняемый скрипт Python, или путь к нему, если он располагается в другом месте:

Файлы .npy удобны для хранения одного массива, если в одном файле нужно сохранить несколько массивов, то необходимо воспользоваться функцией numpy.savez() , которая сохранит их в несжатом виде в файле NumPy с форматом .npz.

После сохранения массивов в файл .npz они могут быть загружены с помощью, уже знакомой нам, функции numpy.load() . Однако, имена массивов теперь изменились с a , b и c на arr_0 , arr_1 и arr_2 соответственно:

Что бы вместе с массивами сохранялись их оригинальные имена, необходимо в функции numpy.savez() указывать их как ключи словарей Python:

В случае очень больших массивов можно воспользоваться функцией numpy.savez_compressed() .

На самом деле, файлы .npz это просто zip-архив который содержит отдельные файлы .npy для каждого массива.

После того как файл был загружен с помощью функции numpy.savez_compressed() его так же легко загрузить с помощью функции numpy.load() :

6.2. Текстовые файлы (.txt)

Очень часто приходится иметь дело с данными, которые хранятся в обычных текстовых файлах (.txt). Как правило, данные представлены в виде строк, в каждой строке может быть несколько значений, разделенных некоторым символом-разделителем, как правило » — пробелом, ‘,’ или любым другим символом (или группой символов). Такие файлы, по своей сути, являются текстовыми представлениями таблиц, данные которых необходимо как-то загружать и выгружать.

Для работы с данными в текстовом формате NumPy предоставляет очень гибкие функции, но пока мы ограничимся рассмотрением лишь двух из них numpy.savetxt() и numpy.loadtxt() в самом простом случае их использования.

Если заглянуть в получившийся файл, то мы увидим следующее:

Как видим, одномерный массив записывается в текстовый файл простой последовательностью строк, одно значение — одна строка. Давайте сохраним двумерный массив:

Двумерный массив в получившемся текстовом файле будет выглядеть следующим образом:

Каждой строке в текстовом файле соответствует строка из загруженного массива с разделенными пробелом значениями.

Если попробовать сохранить в текстовый файл трехмерный массив или же массив с большей размерностью, то это приведет к ошибке:

C чем связано такое поведениесказать трудно и можно подумать, что это является большим минусом, однако, напомню, что работа с текстовыми файлами имеет совсем другую основную цель — большие таблицы с данными самого разного типа.

Итак, у нас есть два файла test_1.txt и test_2.txt, теперь загрузим массивы которые в них хранятся с помощью функции numpy.loadtxt() :

Как видим, все довольно просто. Но, мы не рассматривали загрузку данных из реальных таблиц, вид которых может быть очень сложным. Например, у нас есть текстовый файл loadtxt_example.txt со следующими данными:

Функция numpy.loadtxt() позволяет загрузить эти данные в так называемый структурированный массив NumPy:

Обрабатывать отсутствующие значения (строка 8 и 15):

Или выгружать только необходимые столбцы таблицы:

И это только малая часть всех возможностей, которые предоставляет NumPy для работы с данными в текстовом виде. Функция numpy.fromregex() позволяет создавать массивы из текстовых файлов с использованием регулярных выражений, а функция numpy.genfromtxt() имеет более 20 параметров настройки и предоставляет самые гибкие решения создания массивов из текстовых файлов.

6.3. Бинарные файлы

Самым простым и самым быстрым способом сохранения массивов является создание простых двоичных файлов. Однако, при такой форме сохранения теряется информация о порядке байтов данных и точности данных. Чаще всего, этот недостаток, не имеет никакого значения, но ситуации в которых такая потеря может оказаться критичной, все же бывают.

Рассмотрим простой пример:

Как видим, двоичный файл создан не с помощью функции NumPy, а спомощью метода базового класса ndarray объектами которого являются все массивы. Что бы загрузить массив из такого файла необходимо воспользоваться функцией numpy.fromfile() :

Как видим данные полностью и безошибочно загрузились. Тем не менее, будте осторожны, если вы передаете данные в таком виде между машинами с разной архитектурой или другими нюансами, которые связаны с порядком байтов данных и их точностью.

Читать:
Сколько будет бесконечность минус бесконечность

Похожие статьи