матрица на 90 градусов по часовой стрелке с использованием списка в Python - PullRequest
0 голосов
/ 22 декабря 2018

Я пытаюсь повернуть матрицу 3 * 3 по часовой стрелке на 90 градусов в Python.Я определил, что элемент в [i] [j] переходит в [j] [new_i].Здесь new_i зависит от предыдущего i, поэтому я сделал для него функцию, называемую циклическим вычитанием.

если i равен 0, то new_i равно 2

, если i равно 1, new_i равно 1

, если i равно 2, то new_i равно 0

после выполненияЭто дало мне неожиданные результаты.

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

'''
1 2 3                       7 4 1
4 5 6  rotate 90 degrees    8 5 2
7 8 9                       9 6 3


'''

def circular_subtraction(i):
    new_i = i 
    if(i==0):
        new_i = 2
    elif(i==1):
        new_i = 1
    elif(i==2):
        new_i = 0
    return new_i


def rotate_clock(matrix):
    new_matrix = matrix

for i in range(len(matrix)):
    for j in range(len(matrix)):
        new_i = circular_subtraction(i)
        new_matrix[j][new_i] = matrix[i][j]
        print("New element added from {},{} to {},{} ::: {} to {}".format(i+1,j+1,j+1,new_i+1,matrix[i][j],new_matrix[j][new_i]))

for each_row in new_matrix:
    print(each_row)




matrix = [[1,2,3],[4,5,6],[7,8,9]]
print("Length of the matrix : ",len(matrix))
for each_row in matrix:
    print(each_row)
print()
matrix = rotate_clock(matrix)

входная матрица была

[1, 2, 3]
[4, 5, 6]
[7, 8, 9]

Ожидаемый результат:

[7, 4, 1]
[8, 5, 2]
[9, 6, 3]

Результат:

[7, 4, 1]
[2, 5, 2]
[1, 2, 1]

Ответы [ 4 ]

0 голосов
/ 22 декабря 2018

Общий метод поворота Matrix независимо от формы.

import numpy as np
A=np.array([[1, 2, 3, 33], [4, 5, 6, 66], [7, 8, 9, 99]])
A
array([[ 1,  2,  3, 33],
       [ 4,  5,  6, 66],
       [ 7,  8,  9, 99]])

rotated_A=np.zeros((len(A[0]),len(A)))
for i in range(len(A)):
    for j in range(len(A[0])):
        rotated_A[j][len(A)-1-i]=A[i][j]
rotated_A
array([[  7.,   4.,   1.],
       [  8.,   5.,   2.],
       [  9.,   6.,   3.],
       [ 99.,  66.,  33.]])
0 голосов
/ 22 декабря 2018

numpy.rot90 также может пригодиться:

import numpy as np

a = [[1, 2, 3],
     [4, 5, 6],
     [7, 8, 9]]
a_rot = np.rot90(a, k=3).tolist()
for row in a_rot:
  print(row)

Вывод

[7, 4, 1]
[8, 5, 2]
[9, 6, 3]
0 голосов
/ 22 декабря 2018

Для этого можно использовать функцию numpy rot90: np.rot90

mat = [[1, 2, 3], [4,5,6,], [7,8,9]]
np.rot90(mat, k=1, axes=(1,0))

k - указывает количество оборотов
Ось - указывает направление вращения

Вывод

array([[7, 4, 1],
   [8, 5, 2],
   [9, 6, 3]])

Проблема в вашем коде

В коде отсутствуют отступы (но при условии, что они правильные)
строка:

new_matrix = matrix

назначает новую ссылку на матричную переменную.
В python значение по умолчанию не копируется по значению.Вы можете использовать функцию глубокого копирования: copy.deepcopy (x [, memo])

import copy

def rotate_clock(matrix):
    new_matrix = copy.deepcopy(matrix)

ИЛИ

def rotate_clock(matrix):
    new_matrix = [row[:] for row in matrix]

В противном случае,каждое изменение, которое вы вносите в new_matrix, выполняется и в исходной матрице.(поскольку new_matrix - это просто ссылка на матрицу)

0 голосов
/ 22 декабря 2018

Вы можете сделать что-то вроде этого:

matrix = [[1, 2, 3],
          [4, 5, 6],
          [7, 8, 9]]

rotated = [list(reversed(col)) for col in zip(*matrix)]

for row in rotated:
    print(*row)

Вывод

7 4 1
8 5 2
9 6 3

for col in zip(*matrix) получает столбец матрицы, как только вы получитестолбцы, вам необходимо повернуть их вспять, используя list(reversed(col)), а затем использовать понимание списка , чтобы сложить все вместе:

rotated = [list(reversed(col)) for col in zip(*matrix)]

Приведенное выше понимание списка эквивалентно следующему менее pythonic для цикла:

rotated = []
for col in zip(*matrix):
    rotated.append(list(reversed(col)))

Далее

  1. Документация на zip , в обратном порядке и список .
  2. Обозначение *matrix известно как распаковка кортежа, подробнее здесь .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...