Python矩阵转置与乘法实现:常规逻辑与zip解包技巧
本文详细解析Python中矩阵转置与矩阵相乘的两种实现方式。矩阵转置介绍常规双重循环法与利用zip解包的简洁写法;矩阵乘法则强调行列匹配判断,并通过转置B矩阵优化计算逻辑,提供完整可运行代码示例供参考。
本文分享Python实现矩阵转置及矩阵相乘的具体代码示例,供开发者参考学习。
矩阵转置实现
矩阵转置
方法一:采用常规循环逻辑
常规循环法代码
def transpose(M):
# 初始化转置后的矩阵
result = []
# 获取转置前的行和列
row, col = shape(M)
# 先对列进行循环
for i in range(col):
# 外层循环的容器
item = []
# 在列循环的内部进行行的循环
for index in range(row):
item.append(M[index][i])
result.append(item)
return result
核心思路是将矩阵的行转换为列,列转换为行。
- 首先定义一个用于存储转置结果的容器。
- 外层循环遍历列索引i,内部定义临时数组;内层循环遍历行索引j,依次提取M[j][i]元素并加入临时数组。
- 每完成一次列循环,将生成的临时数组追加至最终结果数组。
- 当所有列循环结束后,最终数组即为原矩阵的转置结果。
方法二:利用zip解包
zip解包法代码
def transpose(M):
# 直接使用zip解包成转置后的元组迭代器,再强转成list存入最终的list中
return [list(row) for row in zip(*M)]
实现思路如下:
zip函数解包后可返回一个迭代器,将多个可迭代对象组合为元组序列,例如:
zip函数示例
my_zip = list(zip(['a', 'b', 'c'], [1, 2, 3]))
print(my_zip) # [('a', 1), ('b', 2), ('c', 3)]
在循环过程中将生成的元组转换为list,并汇总至总列表中。
矩阵相乘
矩阵乘法实现
def matrixMultiply(A, B):
# 获取A的行数和列数
A_row, A_col = shape(A)
# 获取B的行数和列数
B_row, B_col = shape(B)
# 不能运算情况的判断
if(A_col != B_row):
raise ValueError
# 最终的矩阵
result = []
# zip 解包后是转置后的元组,强转成list, 存入result中
BT = [list(row) for row in zip(*B)]
# 开始做乘积运算
for A_index in range(A_row):
# 用于记录新矩阵的每行元素
rowItem = []
for B_index in range(len(BT)):
# num 用于累加
num = 0
for Br in range(len(BT[B_index])):
num += A[A_index][Br] * BT[B_index][Br]
# 累加完成后,将数据存入新矩阵的行中
rowItem.append(num)
result.append(rowItem)
return result
说明:A矩阵与B矩阵相乘得到新矩阵X,具体思路如下。
- 首先验证乘法可行性:前提是A矩阵的列数必须等于B矩阵的行数。
- 可通过图形化理解:若A为3行5列,B为5行2列,则结果矩阵X应为3行2列。
- 将B矩阵转置得到BT(2行5列),此时A与BT均拥有5列,便于对应计算。
- 计算新矩阵X时,取A的第i行元素与BT的第i行对应元素相乘并累加,构成X的新行。遍历A的所有行(共3行),逐步生成新矩阵X。
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python数学运算技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》
希望本文所述的代码示例对您的Python程序设计有所帮助。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













