Как отзеркалить матрицу в python
Перейти к содержимому

Как отзеркалить матрицу в python

  • автор:

Как отзеркалить матрицу в python

Скачай курс
в приложении

Перейти в приложение
Открыть мобильную версию сайта

© 2013 — 2024. Stepik

Наши условия использования и конфиденциальности

Get it on Google Play

Public user contributions licensed under cc-wiki license with attribution required

Зеркально отразить элементы матрицы относительно горизонтальной оси симметрии

Author24 — интернет-сервис помощи студентам

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

Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Зеркально отразить элементы матрицы относительно главной диагонали
Дана квадратная матрица A порядка M. Зеркально отразить ее элементы относительно главной диагонали.

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

Заполнить матрицу случайными числами. Отразить симметрично относительно вертикальной оси сектора матрицы
Заполнить матрицу случайными числами. Отразить симметрично относительно вертикальной оси сектора.

Зеркально отразить изображение относительно побочной диагонали
В файле image.jpg лежит изображение с одинаковой шириной и высотой. Зеркально отразите его.

Зеркально отразить элементы матрицы относительно горизонтальной оси симметрии
Дана матрица размера M × N. Зеркально отразить ее элементы относительно горизонтальной оси.

Регистрация: 08.04.2022
Сообщений: 34

import numpy as np m = int(input("m = ")) r = np.random.rand(m*(m+1)//2) print(r) sym = np.zeros((m,m)) for i in range(m): t = i*(i+1)//2 sym[i,0:i+1] = r[t:t+i+1] sym[0:i,i] = r[t:t+i] print(sym) input() print()

Я что-то да и написал но не знаю хорошо ли. Скажите пожалуйста правильно или вообще не то.

Эксперт Python

8219 / 4338 / 1838
Регистрация: 27.03.2020
Сообщений: 7,162

Лучший ответ

Сообщение было отмечено mik-a-el как решение

Решение

1 2 3 4 5 6
import numpy as np m = int(input("m = ")) r = np.random.randint(1,9,(m,m)) print(r) print(np.flip(r,0)) print(r[::-1,:])

Python-сообщество

[RSS Feed]

  • Начало
  • » Python для новичков
  • » Отражение матрицы по горизонтальной оси

#1 Дек. 9, 2018 18:12:16

Zyxer25 Зарегистрирован: 2018-11-25 Сообщения: 2 Репутация: 0 Профиль Отправить e-mail

Отражение матрицы по горизонтальной оси

Помогите разработать функцию, которая зеркально отражает входную матрицу по горизонтали

#2 Дек. 10, 2018 06:17:25

Rafik Зарегистрирован: 2018-09-04 Сообщения: 231 Репутация: 27 Профиль Отправить e-mail

Отражение матрицы по горизонтальной оси

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

matr = [[1,2,5,4,0],[9,1,3,1,2]] for stroka in matr: stroka.reverse() print(stroka) 

Работа с матрицами в 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, которая представляет собой обратную матрицу исходной матрицы.

Заключение

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

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

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

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