如何从任意长度列表提取列?并判断两矩阵是否互为转置
嘿,刚好碰到过类似的问题,我来给你捋清楚怎么解决!
解决任意长度矩阵的转置判断问题
首先,我们得先搞清楚怎么从任意长度的矩阵里提取列,然后再用这个逻辑来判断两个矩阵是不是互为转置。
1. 提取任意长度矩阵的列
不管矩阵有多少行多少列,要提取第n列(注意Python里索引从0开始),用列表推导式就能轻松搞定:
# 提取matrix的第n列 n = 0 column = [row[n] for row in matrix]
比如你给的matrix_1 = [[1,2],[3,4],[5,6]],提取第0列就是[1,3,5],第1列就是[2,4,6],刚好对应matrix_2的两行。
不过要注意,这个方法要求矩阵的所有行长度一致(也就是正规矩阵),如果有的行短有的行长,提取的时候会报错,所以判断转置前我们得先检查矩阵的合法性。
2. 判断两个矩阵是否互为转置
判断的核心逻辑其实很简单:矩阵A的转置等于矩阵B,那它们就互为转置。而转置任意矩阵的话,Python里的zip函数是个神器,不用自己写循环去一个个提取列。
步骤拆解:
- 第一步:先检查两个矩阵的维度是否匹配。比如矩阵1是
M行N列,那矩阵2必须是N行M列,不然直接返回False。 - 第二步:把其中一个矩阵转置,然后和另一个矩阵比较是否完全相等。
完整代码实现
def transpose_matrix(matrix): # 处理空矩阵的特殊情况 if not matrix: return [] # zip(*matrix)会把每一行的对应元素打包成元组,再转成列表就是转置后的矩阵 return [list(col) for col in zip(*matrix)] def are_transposes(matrix1, matrix2): # 两个空矩阵也算互为转置 if not matrix1 and not matrix2: return True # 一个空一个非空,直接不匹配 if not matrix1 or not matrix2: return False # 检查维度是否对应:matrix1的行数 == matrix2的列数,matrix1的列数 == matrix2的行数 if len(matrix1) != len(matrix2[0]) or len(matrix1[0]) != len(matrix2): return False # 转置matrix1后和matrix2比较 return transpose_matrix(matrix1) == matrix2
测试你的示例
matrix_1 = [[1, 2], [3, 4], [5, 6]] matrix_2 = [[1, 3, 5], [2, 4, 6]] print(are_transposes(matrix_1, matrix_2)) # 输出:True
额外说明
- 如果你的矩阵里有不同长度的行(非正规矩阵),这个函数会在检查维度的时候返回False,因为
len(matrix1[0])会取第一行的长度,而如果matrix2的行数和这个不相等,就直接不匹配了。 zip(*matrix)的原理是把矩阵的每一行作为独立参数传给zip,zip会按位置把所有行的第i个元素组合成一个元组,这样就得到了转置后的每一列。
内容的提问来源于stack exchange,提问作者Mart
相关产品推荐
相关产品推荐

