Ошибка транспонирования матрицы (замена столбцов на строки)
Пытаюсь транспонировать массив. То есть, чтобы столбцы стали строками.
Написал вот такое вот:
arr = ([[2, 0, 0, 0, 0, 0, 1, 1, 1, 1],
[0, 1, 1, 1, 0, 0, 0, 0, 0, 3],
[0, 0, 0, 0, 0, 0, 1, 1, 4, 0],
[0, 0, 1, 1, 1, 0, 0, 0, 0, 5],
[6, 0, 0, 0, 0, 0, 0, 1, 1, 0],
[7, 0, 1, 1, 1, 1, 0, 0, 0, 0],
[0, 8, 0, 0, 0, 0, 0, 0, 1, 1],
[0, 0, 1, 0, 1, 1, 1, 0, 0, 9],
[1, 1, 0, 0, 0, 0, 0, 0, 0, 22],
[0, 0, 0, 1, 1, 0, 0, 0, 0, 23]])
x = 0
a = []
b = []
while x < 10:
for y in range(10):
b.append(arr[y][x])
print(b, 'апендим к Б')
a.append(b)
print(a, 'апендим к А')
x += 1
b.clear()
print(b, 'Очищаем Б')
print(a, 'Конец')
Пытаюсь найти ошибку при помощи print. И вот на моменте a.append(b) начинается ерунда. Почему-то добавляется один и тот же список в количестве равном x цикла while.
Никак не могу понять, в чём дело.
Ответы (3 шт):
Ошибка тут:
b.clear()
Делайте каждый раз новый список внутри цикла, так же, как вы это делаете до цикла:
b = []
Иначе у вас во всех ячейках списка a будет ссылка на один и тот же экземпляр списка b.
Можно сделать проще с помощью numpy:
import numpy as np
arr = ([[2, 0, 0, 0, 0, 0, 1, 1, 1, 1],
[0, 1, 1, 1, 0, 0, 0, 0, 0, 3],
[0, 0, 0, 0, 0, 0, 1, 1, 4, 0],
[0, 0, 1, 1, 1, 0, 0, 0, 0, 5],
[6, 0, 0, 0, 0, 0, 0, 1, 1, 0],
[7, 0, 1, 1, 1, 1, 0, 0, 0, 0],
[0, 8, 0, 0, 0, 0, 0, 0, 1, 1],
[0, 0, 1, 0, 1, 1, 1, 0, 0, 9],
[1, 1, 0, 0, 0, 0, 0, 0, 0, 22],
[0, 0, 0, 1, 1, 0, 0, 0, 0, 23]])
a = np.array(arr)
print(a)
print(a.T)
Идиоматический вариант транспонирования матрицы на "Vanilla Python":
arr_transposed = list(zip(*arr))
результат:
In [15]: arr_transposed
Out[15]:
[(2, 0, 0, 0, 6, 7, 0, 0, 1, 0),
(0, 1, 0, 0, 0, 0, 8, 0, 1, 0),
(0, 1, 0, 1, 0, 1, 0, 1, 0, 0),
(0, 1, 0, 1, 0, 1, 0, 0, 0, 1),
(0, 0, 0, 1, 0, 1, 0, 1, 0, 1),
(0, 0, 0, 0, 0, 1, 0, 1, 0, 0),
(1, 0, 1, 0, 0, 0, 0, 1, 0, 0),
(1, 0, 1, 0, 1, 0, 0, 0, 0, 0),
(1, 0, 4, 0, 1, 0, 1, 0, 0, 0),
(1, 3, 0, 5, 0, 0, 1, 9, 22, 23)]
UPD: если важно получить именно список списков, а не список кортежей, то можно сделать так, как посоветовал @dIm0n в комментарии):
In [25]: list(map(list, zip(*arr)))
Out[25]:
[[2, 0, 0, 0, 6, 7, 0, 0, 1, 0],
[0, 1, 0, 0, 0, 0, 8, 0, 1, 0],
[0, 1, 0, 1, 0, 1, 0, 1, 0, 0],
[0, 1, 0, 1, 0, 1, 0, 0, 0, 1],
[0, 0, 0, 1, 0, 1, 0, 1, 0, 1],
[0, 0, 0, 0, 0, 1, 0, 1, 0, 0],
[1, 0, 1, 0, 0, 0, 0, 1, 0, 0],
[1, 0, 1, 0, 1, 0, 0, 0, 0, 0],
[1, 0, 4, 0, 1, 0, 1, 0, 0, 0],
[1, 3, 0, 5, 0, 0, 1, 9, 22, 23]]