Чтение матрицы из файла.
Здравствуйте! Мне нужно прочитать матрицу из файла 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() :
Как видим данные полностью и безошибочно загрузились. Тем не менее, будте осторожны, если вы передаете данные в таком виде между машинами с разной архитектурой или другими нюансами, которые связаны с порядком байтов данных и их точностью.