• 【Python】实现M行N列的矩阵转置


    说明

    当我们使用 JAVA或者C语言 对矩阵a进行矩阵转置时,主要思路是:先获得矩阵a的行M和列N,然后再生成一个b[N][M]的矩阵,最后执行b[N][M]=a[M][N]操作。那么对于Python语言应该如何进行矩阵的转置呢?

    解决方法

    1. 预定义一个存放矩阵a[M][N]的转置矩阵b[N][M]

    首先我们当然可以使用和JAVAC语言相同的办法解决这个问题.预定义一个存放矩阵a[M][N]的转置矩阵b[N][M]

    a = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14, 15]]
    """预定义一个存放a转置的空间:b=[[],[],[]]"""
    b = [[] for col in range(len(a[0]))]
    """转置"""
    for row in range(len(a)):
        for col in range(len(a[0])):
            b[col].append(a[row][col])  # a矩阵的列是b矩阵的行
    print(b)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2. 使用 列表生成式 进行矩阵的转换:

    首先考虑第一种预先定义一块转置矩阵存储空间的方法,类似于:

    b = [[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0]]
    
    • 1

    如果想要使用列表生成式来形成上面的b矩阵,可以先生成三行,再在每一行生成5个0。
    生成行的列表生成式1是:

    [[] for col in range(len(a[0]))]
    
    • 1

    在每一行生成0的列表生成式2是:

    [0 for row in range(len(a))]
    
    • 1

    如果将上面两个生成式嵌套在一起,得到列表生成式3

    b = [[0 for row in range(len(a))] for col in range(len(a[0]))]
    
    • 1

    就可以得到下面的预存储矩阵空间:

    b = [[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0]]
    
    • 1

    那么问题来了:
    我们能不能把列表生成式2中的0直接更改为我们的a矩阵转置之后的元素值呢?
    答案是可以的,于是就得到了列表生成式4

    c = [[a[row][col] for row in range(len(a))] for col in range(len(a[0]))]
    
    • 1

    使用列表生成式4可以直接得到a矩阵的转置

    3. 使用 zip()函数,map()函数,解包 的组合来实现矩阵转置:

    zip()函数
    它可以将多个序列(列表、元组、字典、集合、字符串以及 range() 区间构成的列表)“压缩”成一个 zip 对象。所谓“压缩”,其实就是将这些序列中对应位置的元素重新组合,生成一个个新的元组。
    map()函数
    会根据提供的函数对指定序列做映射。
    第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。

    解包

    解包就是把一个容器拆开、分解,在Python中的解包是自动完成的。

    zip()map()都是常用的函数,而解包不常见,现在对解包做解释:

    1. 任何可迭代对象都可以解包

    2. 解包的使用方法是在可迭代对象的前面加*,解包分为一个*解包,和两个 *解包,两个*解包只能出现在字典中

    3. 所谓解包,就是剥去外衣,留下核心,例如:
      对以下可迭代对象解包的结果:

    列表:

    d = [1,2,3]
    print(*d)   # 结果:1,2,3
    
    • 1
    • 2

    字符串:

    d = 'abcd'
    print(*d)	# 结果:a b c d
    
    • 1
    • 2

    字典:
    使用一个*对字典解包:

    d = {'f': 1, 'b': 2, 'c': 3}
    print(*d)	# 结果:f b c
    
    • 1
    • 2

    使用两个*对字典解包:

    d = {'f': 1, 'b': 2, 'c': 3}
    def fun(f, b, c):
        print(f, b, c)
    fun(**d)	# 结果:1 2 3
    
    • 1
    • 2
    • 3
    • 4

    注意:使用一个*对字典解包,得到的是字典的key值。而使用两个*对字典解包时,得到的是去掉大括号之后的key:value,key:value,...(我的理解,如果错误请指正)
    所以如果使用print()函数直接打印print(**d)会报:invalid keyword argument for print()的错误。
    所以:对字典两个*的解包一般用于函数参数的传递,并且要求被解包的字典的键名(key)和函数的形参名字相同。例如上面对字典解包的例子。

    有了上面的知识支持,现在就可以进行矩阵的转置了,最终代码是:

    d = list(map(list,zip(*a)))
    
    • 1
  • 相关阅读:
    详细讲解库函数的使用及模拟实现(提升对库函数的理解和运用)
    weapp源码反编译步骤
    嵌入式应用开发之环境搭建及体验
    halcon模板匹配捆绑测量矩形检测芯片针脚
    python多线程
    docker-compose搭建的mysql,如何定时备份数据
    基于R语言结构方程模型
    Kotlin(九)类、属性、构造函数
    小伙伴说VuePress太简洁了,还有没有其他博客推荐?
    T-SQL——将字符串转为单列
  • 原文地址:https://blog.csdn.net/m0_53364919/article/details/127772834