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

python实现矩阵转置的几种方法文章目录(1)方法一、使用numpy转置(2)方法二、使用zip()函数(3)方法三、使用python列表表达式【不占用额外空间,“原地修改”】(4)方法四、新建列表B,使用双重循环添加元素(1)方法一、使用numpy转置importnumpyasnpA=np.mat([[1,2,3],[4,5,6],[7,8,9]])print(A.T)print(A.swapaxes(0,1))#均输出#[[147]#[258]#[369]]importnum

大家好,又见面了,我是你们的朋友全栈君。

(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)) #<zip object at 0x000001CD7733A2C8>
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(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]]

因为转置矩阵的对称性,可以更省时间的写成:

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]]

(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]]
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/137267.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • nodejs搭建MQTT服务器

    nodejs搭建MQTT服务器前言mqtt协议介绍一mqtt协议介绍二图片来自https://www.jianshu.com/p/9e74287e3b07正文安装nodejs下载安装即可。安装mqtt.js模块新建一个文件夹,打开cmd,npminstallmqtt–save,这里很有可能能会报错,百度一下就可以解决。安装好mqtt.js模块后,文件夹中会多两个文件出来。搭建服务器mqttser…

    2022年5月27日
    37
  • 使用ParameterizedThreadStart委托向线程函数传送参数「建议收藏」

    使用ParameterizedThreadStart委托向线程函数传送参数「建议收藏」在不传递参数情况下,一般大家都使用ThreadStart代理来连接执行函数,ThreadStart委托接收的函数不能有参数,也不能有返回值。如果希望传递参数给执行函数,则可以使用带参数的ParameterizedThreadStart委托,     publicdelegatevoidParameterizedThreadStart(Objectobj)可以将要传送给

    2022年7月15日
    20
  • Java XML XXE 底层防御

    Java XML XXE 底层防御JavaXML相关API是由JAXP定义了相关的XML的通用接口,常见包括DOM/SAX/STAX/XPATH的标准APIJavax.xml.parsers ->DOM/SAXJavax.xml.stream ->STAXJavax.xml.xpath  ->XPATHJavax.xml.bind  ->JAXBjavax.xml.ws

    2022年7月20日
    17
  • pipenv是什么_pipenv安装失败

    pipenv是什么_pipenv安装失败pipenv发布于2017年1月,它是一种Python依赖管理工具,你可以把它看做是pip和virtualenv的组合体,pipenv可以帮你管理虚拟环境和依赖文件,并且提供一系列命令和选项来帮助你实

    2022年8月6日
    10
  • autossh

    autosshautossh用来帮助ssh程序在中断后自动重连,在建立隧道的场合相当好用使用autossh可以进行内网穿透

    2025年8月22日
    4
  • 多台服务器共享session问题

    多台服务器共享session问题

    2021年10月26日
    45

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号