Ответ 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')]
Я пытаюсь создать функцию транспонирования матрицы для 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
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')]
>>> 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-массив с элементами списка вместо кортежей.
Если ваши строки не равны, вы также можете использовать 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
>>> 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')]
Намного проще с numpy:
>>> arr = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> arr
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> arr.T
array([[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.T
array([['a', 'd', 'g'],
['b', 'e', 'h'],
['c', 'f', 'i']],
dtype='|S1')
Проблема с вашим исходным кодом заключалась в том, что вы инициализировали transpose[t]
для каждого элемента, а не только для каждой строки:
def matrixTranspose(anArray):
transposed = [None]*len(anArray[0])
for t in range(len(anArray)):
transposed[t] = [None]*len(anArray)
for tt in range(len(anArray[t])):
transposed[t][tt] = anArray[tt][t]
print transposed
Это работает, хотя есть более питоновские способы выполнения одних и тех же вещей, в том числе @J.F. zip
.
Чтобы закончить ответ Дж. Ф. Себастьяна, если у вас есть список списков разной длины, посмотрите этот отличный пост из ActiveState. Короче говоря:
Встроенная функция zip выполняет аналогичное задание, но обрезает результат на длину кратчайшего списка, поэтому некоторые элементы из оригинала после этого данные могут быть потеряны.
Чтобы обрабатывать список списков различной длины, используйте:
def transposed(lists):
if not lists: return []
return map(lambda *row: list(row), *lists)
def transposed2(lists, defval=0):
if not lists: return []
return map(lambda *row: [elem or defval for elem in row], *lists)
"Лучший" ответ уже отправлен, но я думал, что добавлю, что вы можете использовать вложенные списки, как показано в Python Tutorial.
Вот как вы можете получить транспонированный массив:
def matrixTranspose( matrix ):
if not matrix: return []
return [ [ row[ i ] for row in matrix ] for i in range( len( matrix[ 0 ] ) ) ]
Это сохранит прямоугольную форму, так что последующие транспозиции получат правильный результат:
import itertools
def transpose(list_of_lists):
return list(itertools.izip_longest(*list_of_lists,fillvalue=' '))
Я внимательно следил за этими подсказками, чтобы транспонировать матрицу. Мне было трудно получить правильный результат, но в конце концов я это сделал. Однако я не понял, почему мое первое решение (A) не сработало (я потратил несколько часов, чтобы устранить это!). Здесь код:
# Matrix to be transposed
X = [[12, 7, 2, 4, 6],
[4, 5, 7, 2, 4],
[3, 8, 12, 7, 2],
[6 ,7, 3, 8, 12]]
# initialize the transposed matrix
# initial A with zeros
row = [0 for i in range(len(X))]
transposed1 = [row] * (len(X[0]))
# initial B with zeros
transposed2 = []
for i in range(len(X[0])):
transposed2.append([0] * len(X))
# Print the initial matrices
print transposed1
print transposed2
# iterate through rows (i) and columns (j)
for i in range(len(X)):
for j in range(len(X[0])):
transposed1[j][i] = X[i][j]
print transposed
Неправильный (не желаемый) вывод для этого кода:
>>>
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
[[6, 4, 2, 12], [6, 4, 2, 12], [6, 4, 2, 12], [6, 4, 2, 12], [6, 4, 2, 12]]
Затем я изменил транспонирование1 на транспонирование2 и наоборот. На этот раз (желаемый) выход:
>>>
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
[[12, 4, 3, 6], [7, 5, 8, 7], [2, 7, 12, 3], [4, 2, 7, 8], [6, 4, 2, 12]]
Как вы можете видеть, инициализированные нулевые матрицы выглядят одинаково, но результат отличается, в зависимости от того, как генерируется нулевая матрица. Можете ли вы понять, почему?
Cheers, Ристо-Матти
Если вы хотите транспонировать матрицу типа A = np.array([[1,2], [3,4]]), то вы можете просто использовать AT, но для вектора, такого как a = [1,2], aT не возвращает транспонирование! и вам нужно использовать a.reshape(-1, 1), как показано ниже:
импортировать numpy как np a = np.array([1,2]) print ('aT не транспонирует вектор в Python!\n', 'a =', a, '\n', 'aT =', aT ) print ('Транспонировать вектор a is:\n', a.reshape(-1, 1))
A = np.array([[1,2], [3,4]]) print ('Транспонирование матрицы A - это:\n', AT)
Если вы хотите транспонировать матрицу типа A = np.array([[1,2], [3,4]]), то вы можете просто использовать AT, но для вектора, такого как a = [1,2], aT не возвращает транспонирование! и вам нужно использовать a.reshape(-1, 1), как показано ниже
import numpy as np
a = np.array([1,2])
print('a.T not transposing Python!\n','a = ',a,'\n','a.T = ', a.T)
print('Transpose of vector a is: \n',a.reshape(-1, 1))
A = np.array([[1,2],[3,4]])
print('Transpose of matrix A is: \n',A.T)
def matrixTranspose(anArray):
transposed = [None]*len(anArray[0])
for i in range(len(transposed)):
transposed[i] = [None]*len(transposed)
for t in range(len(anArray)):
for tt in range(len(anArray[t])):
transposed[t][tt] = anArray[tt][t]
return transposed
theArray = [['a','b','c'],['d','e','f'],['g','h','i']]
print matrixTranspose(theArray)
#generate matrix
matrix=[]
m=input('enter number of rows, m = ')
n=input('enter number of columns, n = ')
for i in range(m):
matrix.append([])
for j in range(n):
elem=input('enter element: ')
matrix[i].append(elem)
#print matrix
for i in range(m):
for j in range(n):
print matrix[i][j],
print '\n'
#generate transpose
transpose=[]
for j in range(n):
transpose.append([])
for i in range (m):
ent=matrix[i][j]
transpose[j].append(ent)
#print transpose
for i in range (n):
for j in range (m):
print transpose[i][j],
print '\n'
питон 3 простой способ с пониманием
arr = [['a','b','c'],['d','e','f'],['g','h','i']]
transpose = [[arr[y][x] for y in range(len(arr))] for x in range(len(arr[0]))]
a=[]
def showmatrix (a,m,n):
for i in range (m):
for j in range (n):
k=int(input("enter the number")
a.append(k)
print (a[i][j]),
print('\t')
def showtranspose(a,m,n):
for j in range(n):
for i in range(m):
print(a[i][j]),
print('\t')
a=((89,45,50),(130,120,40),(69,79,57),(78,4,8))
print("given matrix of order 4x3 is :")
showmatrix(a,4,3)
print("Transpose matrix is:")
showtranspose(a,4,3)
def transpose(matrix):
x=0
trans=[]
b=len(matrix[0])
while b!=0:
trans.append([])
b-=1
for list in matrix:
for element in list:
trans[x].append(element)
x+=1
x=0
return trans
a = []
m=int(input("enter no of rows in the matrix"))
n=int(input("enter no of columns in the matrix"))
for i in range(0,m) :
a.append([])
for j in range(0,n) :
a[i].append((input("enter element")))
print(a)
trans =[]
for i in range(0,m) :
trans.append([])
for j in range(0,n) :
trans[i].append(a[j][i])
print("tranpose matrix :",trans)
def transpose(matrix):
listOfLists = []
for row in range(len(matrix[0])):
colList = []
for col in range(len(matrix)):
colList.append(matrix[col][row])
listOfLists.append(colList)
return listOfLists
`
def transpose(m):
return(list(map(list,list(zip(*m)))))
Программа Python для транспонирования матрицы:
row,col = map(int,input().split())
matrix = list()
for i in range(row):
r = list(map(int,input().split()))
matrix.append(r)
trans = [[0 for y in range(row)]for x in range(col)]
for i in range(len(matrix[0])):
for j in range(len(matrix)):
trans[i][j] = matrix[j][i]
for i in range(len(trans)):
for j in range(len(trans[0])):
print(trans[i][j],end=' ')
print(' ')