Python中的矩阵转置
Posted
技术标签:
【中文标题】Python中的矩阵转置【英文标题】:Matrix Transpose in Python [duplicate] 【发布时间】:2011-06-23 16:13:32 【问题描述】:我正在尝试为 python 创建一个矩阵转置函数,但我似乎无法使其工作。 说我有
theArray = [['a','b','c'],['d','e','f'],['g','h','i']]
我希望我的功能能够提出
newArray = [['a','d','g'],['b','e','h'],['c', 'f', 'i']]
换句话说,如果我要将这个二维数组打印为列和行,我希望行变成列,列变成行。
到目前为止我做了这个,但它不起作用
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')]
【讨论】:
如果要遍历结果,izip
from itertools
可以为大型数组节省内存。
如何让它返回子列表的列表?喜欢[['a', 'b', 'g'], ['d', 'e', 'h'], ['c', 'f', 'i']]
而不是[('a', 'd', 'g'), ('b', 'e', 'h'), ('c', 'f', 'i')]
?
@acollection_: map(list, zip(*theArray))
.
@AntonyHatchkins Python 3.0 及更高版本不需要。在那里,zip
已经返回了一个迭代器:docs.python.org/3.0/whatsnew/…
@xuiqzy 不是我不知道,而是确实如此。【参考方案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']]
列表生成器使用列表项而不是元组创建一个新的二维数组。
【讨论】:
如果你想将结果分配给一个变量(而不是直接迭代它),这就是要走的路——假设你想要列表而不是元组,如上所述。跨度> 另一个选项(正如接受答案中的 cmets 所暗示的那样)是:list(map(list, zip(*theArray)))
【参考方案3】:
如果你的行不相等,你也可以使用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
代替:
来源:What’s New In 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')]
【讨论】:
【参考方案4】:使用 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')
【讨论】:
【参考方案5】:您的原始代码的问题是您在每个元素处初始化了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
这是可行的,尽管有更多 Pythonic 方法可以完成相同的事情,包括 @J.F. 的 zip
应用程序。
【讨论】:
请注意,此实现不适用于具有不同列数和行数的矩阵【参考方案6】:要完成 J.F. Sebastian 的回答,如果您有不同长度的列表,请查看 this great post from 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)
【讨论】:
这很好。但是,矩阵没有不同长度的列表。 这取决于它们的存储方式。【参考方案7】:“最佳”答案已经提交,但我想我会补充一点,您可以使用嵌套列表推导,如 Python Tutorial 中所示。
以下是获得转置数组的方法:
def matrixTranspose( matrix ):
if not matrix: return []
return [ [ row[ i ] for row in matrix ] for i in range( len( matrix[ 0 ] ) ) ]
【讨论】:
【参考方案8】:这个会保留矩形的形状,以便后续的转置得到正确的结果:
import itertools
def transpose(list_of_lists):
return list(itertools.izip_longest(*list_of_lists,fillvalue=' '))
【讨论】:
【参考方案9】:你可以用下面的列表理解来试试这个
matrix = [['a','b','c'],['d','e','f'],['g','h','i']]
n = len(matrix)
transpose = [[row[i] for row in matrix] for i in range(n)]
print (transpose)
【讨论】:
【参考方案10】:如果你想转置像 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)
【讨论】:
【参考方案11】:你可以简单地使用 python 理解来做到这一点。
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]))]
【讨论】:
虽然这可能是一个正确的答案。如果没有解释它解决原始问题的内容和方式,两行代码并不是很有用。请详细说明您的答案。 对旧问题发布新答案时,期望值很高。请不要发布比已经发布的解决方案低劣的解决方案【参考方案12】: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)
【讨论】:
【参考方案13】:import numpy as np #Import Numpy
m=int(input("Enter row")) #Input Number of row
n=int(input("Enter column")) #Input number of column
a=[] #Blank Matrix
for i in range(m): #Row Input
b=[] #Blank List
for j in range(n):#column Input
j=int(input("Enter Number in Pocket ["+str(i)+"]["+str(j)+"]")) #sow Row Column Number
b.append(j) #addVlaue to list
a.append(b)#Add List To Matrix
a=np.array(a)#convert 1matrix as Numpy
b=a.transpose()#transpose Using Numpy
print(a) #Print Matrix
print(b)#print Transpose Matrix
【讨论】:
【参考方案14】:#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'
【讨论】:
【参考方案15】: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)
【讨论】:
【参考方案16】: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
【讨论】:
【参考方案17】: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
【讨论】:
它是转置的简单实现,尽管也有其他答案中提到的库。【参考方案18】:`
def transpose(m):
return(list(map(list,list(zip(*m)))))
`此函数将返回转置
【讨论】:
【参考方案19】:转置矩阵的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(' ')
【讨论】:
这没用!以上是关于Python中的矩阵转置的主要内容,如果未能解决你的问题,请参考以下文章