Транспонирование матрицы NxN дает неправильные ответы при создании матрицы «результат» = входная матрица
Здесь начинающий программист. Я пытаюсь транспонировать матрицу NxN. Поместите код здесь, чтобы прояснить проблему:
def flippingMatrix(matrix):
result=[[0 for i in range(len(matrix))] for j in range(len(matrix))]
for i in result:
print(i)
for i in range(len(matrix)):
for j in range(len(matrix)):
result[j][i]=matrix[i][j]
for i in result:
print(i)
# //Main Program//
n = int(input().strip())
matrix = []
for i in range(n):
matrix.append(list(map(int, input().rstrip().split())))
result = flippingMatrix(matrix)
Теперь, если мы запустим эту программу, мы введем «N», что означает «нет». строк и столбцов. А в следующей строке элементы в матрицу. Это ввод, который я дал:
2
1 2
3 4
Выход:
[0, 0] //This is the result matrix that I made//
[0, 0]
[1, 3] //The final result matrix//
[2, 4]
Переходя к проблеме: если я назначу
"result=matrix"
вместо
result=[[0 for i in range(len(matrix))] for j in range(len(matrix))]
Я получаю неправильный ответ. Я предполагаю, что нам нужна результирующая матрица только как макет матрицы NxN. Тогда почему результат, аналогичный вводу, дает неверный ответ? Он в любом случае будет перезаписан.
С тем же вводом, что и раньше, я получаю следующий вывод:
[1, 2] //Initial result matrix which is the copied input matrix//
[3, 4]
[1, 2] //The final result matrix//
[2, 4]
Прошу прощения, если проблема немного неясна, я старался изо всех сил. Если кому-то нужны дополнительные объяснения, прокомментируйте этот пост, и я попытаюсь объяснить свою проблему.
Обновлено: Новый код, который я использую после того, как мне предложили отредактировать. Новый код выглядит следующим образом, и я столкнулся с той же проблемой
def flippingMatrix(matrix):
result=matrix
for i in result:
print(i)
for i in range(len(matrix)):
for j in range(len(matrix)):
result[j][i]=matrix[i][j]
return result
# //Main Program//
n = int(input().strip())
matrix = []
for i in range(n):
matrix.append(list(map(int, input().rstrip().split())))
result = flippingMatrix(matrix)
print(result)
Теперь проблема здесь может быть из-за оператора присваивания результат = матрица. Но я не думаю, что матрица результатов должна быть равна нулю, чтобы ее можно было переписать.
@slothrop Спасибо за понимание. Так вы говорите мне, что когда я пишу «результат = матрица», матрица и результат перепутаны? Если я поменяю одну из матриц, другая тоже изменится?
Правильно, написание result = matrix
просто означает, что result
и matrix
являются псевдонимами одного и того же объекта. См.: nedbatchelder.com/text/names.html
Привет @slothrop. Я все еще неясен. Как они могут запутаться? Если я изменю результат, как изменится матрица? Я в замешательстве по этому поводу. Я надеюсь, что вы можете помочь!!
Дело не в том, что result
и matrix
— два запутанных объекта. Дело в том, что result
и matrix
— разные имена, относящиеся к одному и тому же объекту. Например, попробуйте print(id(result), id(matrix))
, и вы увидите, что два идентификатора одинаковы.
Если вы хотите, чтобы result
был новым объектом с данными, идентичными matrix
, то вы можете сделать так: import copy
, за которым следует result = copy.deepcopy(matrix)
.
См., например: stackoverflow.com/questions/2541865/…
Спасибо @slothrop за это объяснение и за ссылку на пост. Пост объяснили хорошо. Я думаю, что причина того, что result=matrix не работает, заключается в том, что это список внутри списка. Прочитал весь пост и теперь лучше понял. Еще раз спасибо. Я не знаю, как пометить ваш комментарий как ответ, но ваш, безусловно, есть!
Прохладный! Я думаю, что ответы на связанный вопрос уже достаточно хорошо его охватывают. Кстати, если вам нужен краткий способ транспонирования 2D-массива, вы можете сделать result = list(zip(*matrix))
. Но полезно пройти через процесс, который у вас есть, потому что вы узнаете больше о задействованных структурах.
Еще раз спасибо за это понимание! Конечно, я узнаю много нового, загрузив сюда один вопрос. Еще раз спасибо!
Ваша функция должна иметь возврат, если вы назначите matrix=result
внутри ее области, это не будет распространяться за пределы функции, это только назначение ссылки/указателя. Значения каждой матрицы не копируются.
Пытаться:
def flippingMatrix(matrix):
result=[[0 for i in range(len(matrix))] for j in range(len(matrix))]
for i in range(len(matrix)):
for j in range(len(matrix)):
result[j][i]=matrix[i][j]
return result
# //Main Program//
n = int(input().strip())
matrix = []
for i in range(n):
matrix.append(list(map(int, input().rstrip().split())))
print(matrix)
result = flippingMatrix(matrix)
print( result)
Протестировано здесь для n = 3:
def flippingMatrix(matrix):
result=[[0 for i in range(len(matrix))] for j in range(len(matrix))]
for i in range(len(matrix)):
for j in range(len(matrix)):
result[j][i] = matrix[i][j]
return result
# //Main Program//
n = 3
matrix = [[i+j*n for i in range(n)] for j in range(3)]
print( matrix) # returns [[0, 1, 2], [3, 4, 5], [6, 7, 8]]
matrix = flippingMatrix(matrix)
print( matrix) # returns [[0, 3, 6], [1, 4, 7], [2, 5, 8]]
Здравствуйте, спасибо за это исправление. Я применю это в моей следующей программе. Однако проблема все еще сохраняется, и возврат переменной не решает эту проблему.
Пожалуйста, поделитесь своим кодом, я только что снова протестировал свой код для матриц линейного размера = 2 и 3, и, похоже, он работает, см. Мое редактирование
Привет. извините за поздний ответ и спасибо за использование кода самостоятельно. Я отредактировал свой пост с обновленным кодом, но, похоже, столкнулся с той же проблемой. Я надеюсь, что вы можете помочь. Еще раз спасибо``
Итак, я узнал, разговаривая в комментариях с @slothrop, Python не воспринимает копирование списков внутри списков легкомысленно. Чтобы сделать копию, я должен использовать разные команды, например, чтобы он фактически создавал независимый 2D-массив:
b = copy.deepcopy(a)
b = [item[:] for item in a]
b = [item.copy() for item in a]
b = [list(item) for item in a]
b = [copy.copy(item) for item in a]
b = []; b.extens[a]
Ссылка на такой другой вопрос здесь.
Похоже, b = []; b.extend[a]
— это ошибка в ответе на другой вопрос. Это то же самое, что делать b = [item for item in a]
вместо b = [item[:] for item in a]
. Все остальные вещи, которые вы предлагаете, отлично подойдут для 2D-массива.
result = matrix
не делает копию: в результатеresult
иmatrix
становятся одним и тем же. Это проблема, потому что подумайте о случае, когдаi=1, j=0
. Тогда вы делаетеresult[0][1] = matrix[1][0]
. Но какова ценностьmatrix[1][0]
в этот момент? Это не исходное значение, это значение, которое вы присвоилиresult[1][0]
на более ранней итерации цикла.