Транспонирование матрицы в Python
Я пытаюсь создать функцию транспонирования матрицы для Python, но, похоже, не могу заставить ее работать. Допустим, у меня есть
theArray = [['a','b','c'],['d','e','f'],['g','h','i']]
и я хочу, чтобы моя функция выдавала
newArray = [['a','d','g'],['b','e','h'],['c', 'f', 'i']]
Другими словами, если бы я печатал этот 2D-массив в виде столбцов и строк, я бы хотел, чтобы строки превратились в столбцы, а столбцы - в строки.
Я уже сделал это, но это не работает
def matrixTranspose(anArray): transposed = [None]*len(anArray[0]) for t in range(len(anArray)): for tt in range(len(anArray[t])): transposed[t] = [None]*len(anArray) transposed[t][tt] = anArray[tt][t] print transposed
Переведено автоматически
Ответ 1
Python 2:
>>> theArray = [['a','b','c'],['d','e','f'],['g','h','i']]>>> zip(*theArray)[('a', 'd', 'g'), ('b', 'e', 'h'), ('c', 'f', 'i')]
Python 3:
>>> [*zip(*theArray)][('a', 'd', 'g'), ('b', 'e', 'h'), ('c', 'f', 'i')]
Ответ 2
>>> theArray = [['a','b','c'],['d','e','f'],['g','h','i']]>>> [list(i) for i in zip(*theArray)][['a', 'd', 'g'], ['b', 'e', 'h'], ['c', 'f', 'i']]
генератор списков создает новый 2d массив с элементами списка вместо кортежей.
Ответ 3
Если ваши строки не равны, вы также можете использовать map:
map
>>> uneven = [['a','b','c'],['d','e'],['g','h','i']]>>> map(None,*uneven)[('a', 'd', 'g'), ('b', 'e', 'h'), ('c', None, 'i')]
Редактировать: В Python 3 функциональность map изменена, itertools.zip_longest вместо этого можно использовать:Источник: Что нового в Python 3.0
itertools.zip_longest
>>> import itertools>>> uneven = [['a','b','c'],['d','e'],['g','h','i']]>>> list(itertools.zip_longest(*uneven))[('a', 'd', 'g'), ('b', 'e', 'h'), ('c', None, 'i')]
Ответ 4
Намного проще с numpy:
>>> arr = np.array([[1,2,3],[4,5,6],[7,8,9]])>>> arrarray([[1, 2, 3], [4, 5, 6], [7, 8, 9]])>>> arr.Tarray([[1, 4, 7], [2, 5, 8], [3, 6, 9]])>>> theArray = np.array([['a','b','c'],['d','e','f'],['g','h','i']])>>> theArray array([['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']], dtype='|S1')>>> theArray.Tarray([['a', 'd', 'g'], ['b', 'e', 'h'], ['c', 'f', 'i']], dtype='|S1')