python实现矩阵转置的几种方法

文章目录

(1)方法一、使用numpy转置(2)方法二、使用zip()函数(3)方法三、使用python列表表达式【不占用额外空间,“原地修改”】(4)方法四、新建列表B,使用双重循环添加元素

(1)方法一、使用numpy转置

import numpy as np

A = np.mat([[1,2,3],[4,5,6],[7,8,9]])

print(A.T)

print(A.swapaxes(0, 1))

# 均输出

# [[1 4 7]

# [2 5 8]

# [3 6 9]]

import numpy as np

A = [[1,2,3],[4,5,6],[7,8,9]]

print(np.transpose(A))

# 输出

# [[1 4 7]

# [2 5 8]

# [3 6 9]]

(2)方法二、使用zip()函数

zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存。可以使用 list() 转换来输出列表。【zip 方法在 Python 2 和 Python 3 中的不同:在 Python 3.x 中为了减少内存,zip() 返回的是一个对象。如需展示列表,需手动 list() 转换。】如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用*号操作符,可以将元组解压为列表。

zip(A)相当于打包,打包为元组的列表:

>>> a = [1,2,3]

>>> b = [4,5,6]

>>> c = [4,5,6,7,8]

>>> A = zip(a,b) # 打包为元组的列表

[(1, 4), (2, 5), (3, 6)]

>>> zip(a,c) # 元素个数与最短的列表一致

[(1, 4), (2, 5), (3, 6)]

>>> zip(*A) # 与 zip 相反,*A 可理解为解压,返回二维矩阵式

[(1, 2, 3), (4, 5, 6)]

A = [[1,2,3],[4,5,6],[7,8,9]]

print(*A) #[1, 2, 3] [4, 5, 6] [7, 8, 9]

#zip()返回的是一个对象。如需展示列表,需手动 list() 转换。

#print(zip(*A)) #

print(list(zip(*A)))

# 输出

# [(1, 4, 7), (2, 5, 8), (3, 6, 9)]

这里python中星号(*)的作用是将变量中可迭代对象的元素拆解出来。

(3)方法三、使用python列表表达式【不占用额外空间,“原地修改”】

A = [[1,2,3],[4,5,6],[7,8,9]]

#print(len(A)) #矩阵行数

#print(len(A[0])) #矩阵列数

B = [[A[j][i] for j in range(len(A))] for i in range(len(A[0]))]

print(B)

# 输出

# [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

B = [[A[j][i] for j in range(len(A))] for i in range(len(A[0]))]

这句写的清楚一点就是:

A = [[1,2,3],[4,5,6],[7,8,9]]

#print(len(A)) #矩阵行数

#print(len(A[0])) #矩阵列数

for i in range(len(A[0])):#len(A[0])矩阵列数

for j in range(i,len(A)):#len(A)矩阵行数

#转置就是A[i][j]和A[j][i]互换

A[j][i], A[i][j] = A[i][j], A[j][i]

print(A)

# 输出

# [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

因为转置矩阵的对称性,for j in range(i,len(A))限制了只遍历矩阵上三角,必须要限制,如果不限制会导致重复交换。

(4)方法四、新建列表B,使用双重循环添加元素

A = [[1,2,3],[4,5,6],[7,8,9]]

B=[]

for i in range(len(A[0])):#len(A[0])矩阵列数

temp = []

for j in range(len(A)):#len(A)矩阵行数

temp.append(A[j][i])

B.append(temp)

print(B)

# 输出

# [[1, 4, 7], [2, 5, 8], [3, 6, 9]]