Перейти к содержимому

Как транспонировать матрицу в питоне

  • автор:

Как правильно транспонировать матрицу

Как правильно сделать функцию из моего кода и чтобы она работала полностью? Код написал, но он не работает с некоторыми входными данными. А именно при нулях (строка = 0, колонка = 0) и при очень больших матрицах(в тестах валится на 950×764 матрице). Функцию, которую пытался написать и код — ниже. Помогите пожалуйста довести до ума. Условие: Есть матрица размера m × n. Нужно написать функцию, которая её транспонирует. Транспонированная матрица получается из исходной заменой строк на столбцы. Формат ввода: В первой строке задано число n — количество строк матрицы. Во второй строке задано m — число столбцов, m и n не превосходят 1000. В следующих n строках задана матрица. Числа в ней не превосходят по модулю 1000. Формат вывода: Напечатайте транспонированную матрицу в том же формате, который задан во входных данных. Каждая строка матрицы выводится на отдельной строке, элементы разделяются пробелами. Пример вводы/вывода: Ввод 4 3 1 2 3 0 2 6 7 4 1 2 7 0 Вывод 1 0 7 2 2 2 4 7 3 6 1 0 Просто код:

rows = int(input().strip()) colums = int(input().strip()) a = [[0]*colums for _ in range(rows)] for i in range(rows): a[i] = [int(j) for j in input().strip().split(" ")] rows_count = len(a) colums_count = len(a[0]) new_matrix = [[0] * rows_count for _ in range(colums_count)] for i in range(rows_count): for j in range(colums_count): new_matrix[j][i] = a[i][j] for row in new_matrix: print(*row) 

Пытался создать функцию из кода выше, но безуспешно. Много ошибок:

def transpose(rows, colums): rows_count = len(a) colums_count = len(a[0]) new_matrix = [[0] * rows_count for _ in range(colums_count)] for i in range(rows_count): for j in range(colums_count): new_matrix[j][i] = a[i][j] for row in new_matrix: print(*row) if __name__ == '__main__': rows = int(input().strip()) colums = int(input().strip()) a = [[0] * colums for _ in range(rows)] for i in range(rows): a[i] = [int(j) for j in input().strip().split(" ")] print(transpose(rows, colums)) 

Правка после комментариев Sergey и A_Vaclav

def transpose(a): for i in range(rows): a[i] = [int(j) for j in input().strip().split(' ')] rows_count = len(a) colums_count = len(a[0]) new_matrix = [[0] * rows_count for _ in range(colums_count)] for i in range(rows_count): for j in range(colums_count): new_matrix[j][i] = a[i][j] for row in new_matrix: print(*row) if __name__ == '__main__': rows = int(input().strip()) colums = int(input().strip()) a = [colums for _ in range(rows)] print(transpose(a)) 

Результат работы функции: Ввод: 4 3 1 2 3 2 4 5 6 78 8 6 8 9 Вывод: 1 2 6 6 2 4 78 8 3 5 8 9 None Проверка случая, когда на вход подаются нули:

def transpose(a): rows_count = len(a) colums_count = len(a) if rows_count == colums_count == 0: print('None') new_matrix = [] for j in range(colums_count): tmp = [] for i in range(rows_count): tmp.append(a[i][j]) new_matrix.append(tmp) return new_matrix if __name__ == '__main__': rows = int(input().strip()) colums = int(input().strip()) a = [[0] * colums for _ in range(rows)] for i in range(rows): a[i] = [int(j) for j in input().strip().split(' ')] # print(transpose(a)) for row in transpose(a): if row != 0: print(*row) 

Входные 0 0 Выходные None Входные: 4 5 4 5 6 7 8 5 6 7 7 8 6 7 8 8 9 8 9 6 4 3 Выходные: (выводит без последней колонки) 4 5 6 8 5 6 7 9 6 7 8 6 7 7 8 4 Если я делаю так colums_count = len(a[0]), то матрица транспонируется нормально, но при нулях ошибка! NoneType is not iterable. Пытался в конце под main() задать условие в цикле, что вывод только если row != 0, но это не помогло

Работа с матрицами в python

Привет, Хабр! Я недавно начал свой путь в data science и хочу поделиться свои опытом в написание алгоритмов для работы с матрицами, я планирую активно пополнять свой репозиторий новыми функциями (понимаю что можно все сделать с нампаем).

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

Во-первых, что такое транспонирование, это операция в последствие которой строки и столбцы меняются местами.

Простейший пример транспонирование матрицы

На фото наглядный пример поворота, это довольна простая операция, которую я реализовал в два цикла.

def transpose_matrix(matrix: list[list]) -> list[list]: transposed_matrix = [[0 for i in range(len(matrix))] for i in range(len(matrix[0]))] for i in range(len(matrix)): for j in range(len(matrix[0])): transposed_matrix[j][i] = matrix[i][j] return transposed_matrix

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

Ранг матрицы

Ранг матрицы — наивысший из порядков всевозможных ненулевых миноров этой матрицы.

Нахождение ранга матрицы

def rank_of_matrix(matrix: list[list]) -> int: rank = min(len(matrix), len(matrix[0])) row_index = 0 for i in range(len(matrix[0])): found_nonzero = False for j in range(row_index, len(matrix)): if matrix[j][i] != 0: found_nonzero = True matrix[row_index], matrix[j] = matrix[j], matrix[row_index] break if found_nonzero: for j in range(row_index + 1, len(matrix)): factor = matrix[j][i] / matrix[row_index][i] for k in range(i, len(matrix[0])): matrix[j][k] -= matrix[row_index][k] * factor row_index += 1 return rank

В самом начале в переменная rank инициализируется минимальным значением между количеством строк и количеством столбцов в матрице. Это определяется тем, что ранг матрицы не может быть больше, чем количество строк или столбцов, row_index равна нулю, так как это будет индексом строки, с котором мы будем работать на каждом шаге. Так же проходимся двумя циклами и ищем первый ненулевой элемент в текущем столбце. Если такой элемент найден, он меняется местами. Это делается для того, чтобы разместить ненулевой элемент на позиции ( row_index, i ) . Если найден ненулевой элемент в текущем столбце на позиции ( row_index, i ) , производится процесс приведения матрицы к ступенчатому виду. Для этого вычисляется коэффициент factor, равный matrix[j][i] / matrix[row_index][i], и затем вычитается matrix[row_index][k] * factor из всех элементов строки j, начиная с позиции i. Это приводит к обнулению всех элементов ниже matrix[row_index][i] в столбце i. Увеличиваем row_index на 1, чтобы перейти к следующей строке и продолжить процесс приведения к ступенчатому виду. По окончании алгоритма возвращается rank, которая представляет собой максимальное количество линейно независимых строк или столбцов в матрице.

Инверсия матрицы

Обратная матрица — это матрица, которая умножается на исходную матрицу таким образом, что их произведение дает единичную матрицу. Другими словами, если у нас есть матрица A и ее обратная матрица обозначается как A^-1.

Сравнение начальной и обратной матрицы

def inverse_matrix(matrix: list[list]) -> list[list]: augmented_matrix = [ [ matrix[i][j] if j < len(matrix) else int(i == j - len(matrix)) for j in range(2 * len(matrix)) ] for i in range(len(matrix)) ] for i in range(len(matrix)): pivot = augmented_matrix[i][i] if pivot == 0: raise ValueError("Matrix is not invertible") for j in range(2 * len(matrix)): augmented_matrix[i][j] /= pivot for j in range(len(matrix)): if i != j: scalar = augmented_matrix[j][i] for k in range(2 * len(matrix)): augmented_matrix[j][k] -= scalar * augmented_matrix[i][k] inverse = [ [augmented_matrix[i][j] for j in range(len(matrix), 2 * len(matrix))] for i in range(len(matrix)) ] return inverse

Переменная augmented_matrix представляет собой расширенную матрицу, добавив единичную матрицу справа. Происходит итерация, получаем значение pivot, которое является текущим диагональным элементом. Если pivot равна 0, вызывается исключение, так как матрица не обратима. Далее делаем нормирование строки, делим все элементы строки на pivot. Это делается для того, чтобы текущий диагональный элемент стал равным 1. Внутренний цикл итерируется по всем столбцам расширенной матрицы. Вычитаем из текущей строки другие строки, умноженные на значение элемента scalar. После завершения внутреннего цикла, матрица будет приведена к верхнетреугольному виду. Создается матрица inverse, которая содержит элементы справа от вертикальной черты в augmented_matrix. Возвращается матрица inverse, которая представляет собой обратную матрицу исходной матрицы.

Заключение

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

Спасибо за выделенное время! Надеюсь было интересно, пишите свои мысли, критикуйте, буду рад исправиться и писать лучшие статьи.

Как транспонировать матрицу в Python

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

Итак, матрица состоит из строк и столбцов. Создать матрицу можно по-разному, но самый простой способ – использовать вложенные списки, как показано ниже:

matrix = [[1, 2, 4], [31, 17, 15]]

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

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

Метод 1. Транспонирование матрицы с помощью NumPy transpose()

Первый метод, который мы разберем, — это использование библиотеки NumPy. NumPy в основном работает с массивами в Python, а для транспонирования мы можем вызвать метод transpose() .

Давайте разберем всё по порядку. Для начала нам нужно импортировать модуль NumPy как np .

Дальше, в ячейке номер [25] мы создаем массив NumPy с именем arr_matrix .

В ячейке номер [26] мы вызываем метод transpose() для нашей матрицы – объекта arr_matrix , который мы создали ранее.

В ячейке номер [27] мы выводим на экран исходную матрицу arr_matrix .

А в ячейке номер [28] – транспонированную матрицу arr_transpose . Можем заметить, что в результате мы получили именно то, что нам было нужно – транспонированную матрицу.

Метод 2. Использование метода numpy.transpose()

Мы также можем транспонировать матрицу в Python с помощью numpy.transpose() . При этом мы передаем матрицу в метод transpose() в качестве аргумента.

В ячейке номер [29] мы создаем матрицу, используя массив NumPy, с именем arr_matrix .

Далее мы передаем arr_matrix в метод transpose() и сохраняем результат в новую переменную arr_transpose .

В ячейке номер [31] мы печатаем исходную матрицу arr_matrix .

А дальше мы выводим на экран транспонированную матрицу arr_transpose . Получаем результат аналогичный тому, что получили в первом примере.

Метод 3. Транспонирование матрицы с использованием библиотеки SymPy

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

Сначала нам, конечно же, нужно импортировать библиотеку SymPy. Она не поставляется вместе с Python по умолчанию, поэтому вы должны установить её в своей системе, иначе код не будет работать.

В ячейке номер [34] мы создаем матрицу с помощью библиотеки sympy.

Дальше, в ячейке [35], мы вызываем transpose (T) при помощи точечного оператора и сохраняем результаты в новую переменную sympy_transpose .

В ячейке номер [36] мы печатаем исходную матрицу matrix . А в ячейке номер [37] – транспонированную матрицу sympy_transpose . Как видим, у нас получилась транспонированная матрица.

Метод 4. Транспонирование матрицы с использованием вложенного цикла

В Python матрицу можно транспонировать и без применения каких-либо библиотек. Для этого нам придется использовать вложенные циклы.

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

В ячейке номер [38] мы создаем матрицу и выводим ее на экран.

В следующей ячейке мы применяем «питонический» способ узнать размерность транспонированной матрицы, используя исходную. А именно — используем генератор списков со вложенными циклами for .

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

В ячейке номер [41] мы выводим исходную матрицу Matrix . А в ячейке [42] — транспонированную матрицу trans_Matrix .

Метод 5. Использование генератора списка

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

Сначала мы создаем матрицу m , используя вложенные списки.

Затем в ячейке номер [44] мы используем вложенные циклы, как и в предыдущем примере. Однако здесь мы делаем это в одну строчку, используя генератор списков. Более того, тут нет никакой необходимости менять индексы [j] [i] местами, как мы это делали в предыдущий раз.

В следующей ячейке мы выводим исходную матрицу m . После этого в ячейке номер [42] выводим транспонированную матрицу trans_m . Как видим, желаемый результат получен.

Метод 6. Транспонирование матрицы с помощью pymatrix

Pymatrix – ещё одна облегченная библиотека для матричных операций в Python. Мы можем выполнить транспонирование и с её помощью.

В ячейке номер [43] мы импортируем библиотеку pymatrix. Она не поставляется вместе с Python по умолчанию, поэтому, чтобы код работал корректно, нужно установить ее в своей системе перед использованием.

Затем при помощи библиотеки pymatrix мы создаем матрицу (в ячейке [44]).

В ячейке номер [45] вызываем метод trans() для нашей матрицы и сохраняем результаты в новую переменную pymatrix_transpose.

Потом мы выводим на экран исходную матрицу matrix . А в ячейке номер [47] выводим уже транспонированную матрицу pymatrix_transpose . Как видим, код отработал правильно.

Метод 7. Использование метода zip

Zip – еще один метод транспонирования матрицы.

В ячейке номер [63] мы создаем новую матрицу, используя вложенные списки.

В ячейке номер [64] мы передаем матрицу в zip с помощью оператора * . Мы вызываем каждую строку, а затем преобразуем эту строку в новый список, который становится транспонированной матрицей.

Заключение

Итак, сегодня мы рассмотрели, как транспонировать матрицу в Python. Мы разобрали различные методы, которые могут помочь нам в транспонировании матрицы (с использованием библиотек и без них).

Мы также познакомились с несколькими новыми библиотеками, такими как pymatrix и sympy.

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

Линейная алгебра на Python. [Урок 2]. Транспонирование Матрицы

Follow us on Google Plus Follow us on rss

В этом уроке мы рассмотрим операцию “транспонирование матрицы” и как она выполняется на Python. Также разберем на примерах свойства этой операции.

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

Транспонирование матрицы – это процесс замены строк матрицы на ее столбцы, а столбцов соответственно на строки. Полученная в результате матрица называется транспонированной. Символ операции транспонирования – буква T .

➣ Численный пример

Для исходной матрицы:

linal-lesson2-pic1

Транспонированная будет выглядеть так:

➤ Пример на Python

Решим задачу транспонирования матрицы на Python . Создадим матрицу A:

>>> A = np.matrix('1 2 3; 4 5 6') >>> print(A) [[1 2 3] [4 5 6]]

Транспонируем матрицу с помощью метода transpose():

>>> A_t = A.transpose() >>> print(A_t) [[1 4] [2 5] [3 6]]

Существует сокращенный вариант получения транспонированной матрицы, он очень удобен в практическом применении:

>>> print(A.T) [[1 4] [2 5] [3 6]]

Рассмотрим на примерах свойства транспонированных матриц. Операции сложения и умножение матриц, а также расчет определителя более подробно будут рассмотрены в последующих уроках.

Свойство 1 . Дважды транспонированная матрица равна исходной матрице:

➣ Численный пример

linal-lesson2-pic4

➤ Пример на Python

>>> A = np.matrix('1 2 3; 4 5 6') >>> print(A) [[1 2 3] [4 5 6]] >>> R = (A.T).T >>> print(R) [[1 2 3] [4 5 6]]

Свойство 2 . Транспонирование суммы матриц равно сумме транспонированных матриц:

linal-lesson2-pic5

➣ Численный пример

linal-lesson2-pic6

➤Пример на Python

>>> A = np.matrix('1 2 3; 4 5 6') >>> B = np.matrix('7 8 9; 0 7 5') >>> L = (A + B).T >>> R = A.T + B.T >>> print(L) [[ 8 4] [10 12] [12 11]] >>> print(R) [[ 8 4] [10 12] [12 11]]

Свойство 3 . Транспонирование произведения матриц равно произведению транспонированных матриц расставленных в обратном порядке:

linal-lesson2-pic7

➣ Численный пример

linal-lesson2-pic8

➤ Пример на Python

>>> A = np.matrix('1 2; 3 4') >>> B = np.matrix('5 6; 7 8') >>> L = (A.dot(B)).T >>> R = (B.T).dot(A.T) >>> print(L) [[19 43] [22 50]] >>> print(R) [[19 43] [22 50]]

В данном примере, для умножения матриц, использовалась функция dot() из библиотеки Numpy.

Свойство 4 . Транспонирование произведения матрицы на число равно произведению этого числа на транспонированную матрицу:

➣ Численный пример

linal-lesson2-pic10

➤ Пример на Python

>>> A = np.matrix('1 2 3; 4 5 6') >>> k = 3 >>> L = (k * A).T >>> R = k * (A.T) >>> print(L) [[ 3 12] [ 6 15] [ 9 18]] >>> print(R) [[ 3 12] [ 6 15] [ 9 18]]

Свойство 5 . Определители исходной и транспонированной матрицы совпадают:

➣ Численный пример

linal-lesson2-pic12

➤ Пример на Python

>>> A = np.matrix('1 2; 3 4') >>> A_det = np.linalg.det(A) >>> A_T_det = np.linalg.det(A.T) >>> print(format(A_det, '.9g')) -2 >>> print(format(A_T_det, '.9g')) -2

Ввиду особенностей Python при работе с числами с плавающей точкой, в данном примере вычисления определителя рассматриваются только первые девять значащих цифр после запятой (за это отвечает параметр ‘.9g’ ).

P.S.

Вводные уроки по “Линейной алгебре на Python” вы можете найти соответствующей странице нашего сайта . Все уроки по этой теме собраны в книге “Линейная алгебра на Python”.

Если вам интересна тема анализа данных, то мы рекомендуем ознакомиться с библиотекой Pandas. Для начала вы можете познакомиться с вводными уроками. Все уроки по библиотеке Pandas собраны в книге “Pandas. Работа с данными”.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *