Python 中的矩阵转置[重复]
- 2024-12-02 08:41:00
- admin 原创
- 172
问题描述:
我正在尝试为 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')]
解决方案 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']]
列表生成器创建一个包含列表项而不是元组的新二维数组。
解决方案 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
可以改用:
来源: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 方法可以完成同样的事情,包括@JF 的zip
应用程序,但这仍然是有效的。
解决方案 6:
为了完成 JF Sebastian 的回答,如果您有一个长度不同的列表列表,请查看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 教程中所示。
获取转置数组的方法如下:
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!
','a = ',a,'
','a.T = ', a.T)
print('Transpose of vector a is:
',a.reshape(-1, 1))
A = np.array([[1,2],[3,4]])
print('Transpose of matrix A is:
',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 '
'
#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 '
'
解决方案 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(' ')
def showtranspose(a,m,n):
for j in range(n):
for i in range(m):
print(a[i][j]),
print(' ')
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(' ')