Как считать матрицу в питоне из файла

Обновлено: 04.07.2024

В этой статье мы познакомим вас с матрицей Python. Каждую операцию матрицы мы будем реализовывать с помощью кода.

Что такое матрица в Python?

Мы изучим следующие операции, которые применяются к матрицам:

  • сложение матриц;
  • матричное вычитание;
  • умножение матриц;
  • скалярное произведение;
  • векторное произведение;
  • и многие другие операции.

Работа матриц

Создание матрицы в Python

Мы можем создать матрицу на Python, используя вложенный список. Все элементы заключаются в квадратные скобки ([]) и разделяются запятой. Посмотрим на следующие примеры:

Чтение матричных данных

Прочитаем каждую строку определенной матрицы.

В следующем примере мы прочитаем последний элемент каждой строки с помощью программы Python.

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

Давайте разберемся со следующей работой матрицы.

Добавление двух матриц

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

Умножение двух матриц

Умножение двух матриц такое же, как в приведенном выше коде, только нужно изменить оператор + на *.

Транспонирование матрицы

В приведенном выше коде у нас есть два цикла for для перебора каждой строки и каждого столбца. Как мы видим, в приведенном выше выводе мы присвоили mat1 [i] [j] и res [j] [k].

Транспонирование с помощью списка

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

Результат такой же, как и выше. Значение списка сократило количество строк кода и транспонировало матрицу.

Получение матричного ввода от пользователя

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

В приведенном выше коде мы взяли данные пользователя, чтобы ввести количество строк и столбцов. Мы ввели 3 строки и 3 столбца; это означает, что в матрице будет 9 элементов. В цикле for элементы вставляются в пустую матрицу с помощью функции append(). Второй цикл for используется для печати входных данных в матричном формате.

Использование функции NumPy и map()

Python предоставляет внешнюю библиотеку NumPy. Она используется для научных вычислений; мы изучим NumPy с матрицей в разделе ниже и используем ее для матрицы пользовательского ввода.

Пример: Создание матрицы с использованием библиотеки NumPy

Библиотека NumPy помогает нам работать с массивом. Чтобы работать с NumPy, нам нужно установить ее, используя следующую команду.

После успешной установки мы должны импортировать ее в нашу программу.

Давайте разберемся в следующем примере.

Работа с матрицей с помощью NumPy

Мы можем выполнять все операции с матрицей, используя numpy.array(), такие как сложение, вычитание, транспонирование, нарезание матрицы и т. д.

Добавление матрицы

Мы создадим две матрицы с помощью функции numpy.array() и добавим их с помощью оператора +. Давайте разберемся в следующем примере.

Умножение

Мы будем использовать метод numpy.dot() для умножения обеих матриц. Это точечное умножение матриц mat1 и mat2, обрабатывает 2D-массив и выполняет умножение.

Нарезка элементов

Мы можем разрезать элемент матрицы, как в стандартном списке Python. Нарезка возвращает элемент на основе индекса начала / конца. Мы также можем сделать отрицательную нарезку. Синтаксис приведен ниже.

Теперь мы реализуем нарезку по матрице. Для выполнения следуйте синтаксису ниже.

Mat1 [row_start: row_end, col_start: col_end]

В приведенном выше синтаксисе:

  • Первое начало / конец представляет строки, которые означают выбор строк матрицы.
  • Первое начало / конец представляет столбцы, которые означают выбор столбца матрицы.

Мы будем выполнять нарезку в приведенной ниже матрице.

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

Заключение

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

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

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

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

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

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

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

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

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

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

Для тестирования скорости чтения числовых данных были сгенерированы 7 тестовых файлов, содержащих 5 столбцов и 10, 100, 1 000, 10 000, 100 000, 1 000 000 и 10 000 000 строк случайных чисел формата float. Размер самого большого файла составил 742 Мб.

Для измерения времени работы программы использовалась функция time. Существует мнение, что измерять с её помощью время работы некорректно. Однако в данном случае меня интересовало работа с большими объемами данных, когда время работы программы составляло несколько десятков секунд. В таком случае отклонение в полсекунды вносило погрешность менее 1%.

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 с использованием библиотеки Pandas, который даже обогнал по скорости чтения данных языки C++ и Fortran.

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

10 комментариев к записи

ошибка в таблице ! 0.044 не меньше чем 0.005 а больше почти в 9 раз!

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

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

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

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

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

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

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

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

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

Загрузка и сохранение данных в бинарных файлах

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

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

Когда нужно восстановить данные из файла .npy , используется функция load() . Она требует определить имя файла в качестве аргумента с расширением .npy .

Чтение файлов с табличными данными

Часто данные для чтения или сохранения представлены в текстовом формате (TXT или CSV). Их можно сохранить в такой формат вместо двоичного, потому что таким образом к ним можно будет получать доступ даже вне NumPy, с помощью других приложений. Возьмем в качестве примера набор данных в формате CSV (Comma-Separated Values — значения, разделенные запятыми). Данные здесь хранятся в табличной форме, а значения разделены запятыми.

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

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

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

Возьмем в качестве примера предыдущий файл с удаленными элементами. Сохраним его как data2.csv .

Выполнение этих команд приведет к тому, что genfromtxt() заменит пустые области на значения nan .

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

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

Содержание

  • 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. Чтение/запись данных разных типов: список и кортеж

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

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

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

Почему мы используем файлы .mat в Python?

Цель .mat Файл, возможно, не кажется очевидным сразу. Но при работе с большими наборами набора данных информация, содержащаяся в этих файлах, абсолютно имеет решающее значение для проектов науки о науке/машины!

Это потому, что .mat Файлы содержат метаданные каждого объекта/записи в набор данных.

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

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

Как читать файлы .mat в Python?

По умолчанию Python не способен читать файлы .mat. Нам нужно импортировать библиотеку, которая знает, как обрабатывать формат файла.

1. Установите Scipy

Подобно тому, как мы используем модуль CSV для работы с файлами .csv, мы импортируем Scipy Sibary для работы с файлами .mat в Python.

Если у вас еще нет Scipy, вы можете использовать команду PIP, чтобы установить одинаковую

2. Импортируйте модуль scipy.io.io.oloadmat

В этом примере я буду использовать аннотации аккордеона, предоставленные Caltech, в 101 Категории объектов Отказ

После выполнения, печать Аннонас предоставит нам это в качестве вывода.

Начал, вы можете увидеть, что этот единственный .mat Файл предоставляет информацию относительно Версия MATLAB используется, платформа, дата его создания и намного больше Отказ

Часть, которую мы должны сосредоточиться на том, однако, Box_coord. и то obj_contour .

3. Разбираться в анализе структуры файлов .mat

Если вы проходили информацию о аннотациях, предоставленных Caltech, вы знаете, что эти цифры являются очертаниями соответствующего изображения в наборе данных.

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

Память через эту структуру файлов, мы могли бы назначить все значения контура в новый список Python.

Если мы напечатали con_list Мы получим простую 2D массив.

4. Используйте Pandas DataFrames для работы с данными

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

Мы используем Dataframes Как структура для работы, в том, что она функционирует так же, как таблица данных. Аккуратный, чтобы посмотреть, и чрезвычайно просто использовать.

Теперь, чтобы работать с DataFrames, нам нужно импортировать еще один модуль, Пандас Отказ

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

Работа с полученными вышеданными данные, могут быть упрощены с помощью Pands, чтобы построить рамку данных со строками и столбцами для данных.

Теперь у нас есть наши данные в аккуратном DataFrame!

Как видите, у нас есть координаты X и Y для наброски изображения в простом Dataframe двух столбцов.

Это должно обеспечить вам некоторую ясность о природе данных в файле.

Процесс создания данных DataFrames для каждого .mat Файл отличается, но, с опытом и практикой, создавая их из .mat Файлы должны прийти к вам естественным путем.

Это все для этой статьи!

Заключение

Теперь вы знаете, как работать с .mat Файлы в Python и как создавать файлы данных в Pands с его содержанием.

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

Читайте также: