我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

继续ndarray矩阵翻转的问题,在前面的文章中,是使用.T属性来解决这个问题的,简单好用省力。本文介绍另外一种方法,是基于numpytranspose()方法。它的作用和.T是一致的,绝大多数情况下,都是可以互换的。那么,numpy.transpose()又有什么特别的用法么?这就是本文要讨论的问题。

苏南大叔:如何使用transpose转置ndarray矩阵?与T属性有何不同? - transpose转置ndarray
如何使用transpose转置ndarray矩阵?与T属性有何不同?(图8-1)

大家好,这里是苏南大叔的“程序如此灵动”博客,本文讨论numpy.transpose()方法。测试环境:win10python@3.11.0numpy@1.24.2pandas@1.5.3

transpose,英文释义:转置;使换位;使转移;使(乐曲)变调,移调;使变形;使掉换顺序。

numpy.transpose().T大概率相同

大概率情况下,numpy.transpose().T是一致的效果。下面的代码,演示了一维二维三维的情况下,两者的结果对比。ndarray是否相等的文章总结,请参考:

转置一维数组【一维的.T和原值一样,没有必要执行.T】:

import numpy as np
sn = np.array(["苏", "南", "大", "叔"])
print(np.transpose(sn))
print(np.array_equal(sn.T, np.transpose(sn)))

苏南大叔:如何使用transpose转置ndarray矩阵?与T属性有何不同? - 一维数组转置
如何使用transpose转置ndarray矩阵?与T属性有何不同?(图8-2)

转置二维数组:

import numpy as np
sn = np.array([["苏", "南"], ["大", "叔"]])
print(np.transpose(sn))
print(np.array_equal(sn.T, np.transpose(sn)))

苏南大叔:如何使用transpose转置ndarray矩阵?与T属性有何不同? - 二维数组转置
如何使用transpose转置ndarray矩阵?与T属性有何不同?(图8-3)

转置三维矩阵:

import numpy as np
sn = np.array(
    [
        [["苏1", "南1"], ["大1", "叔1"]],
        [["苏2", "南2"], ["大2", "叔2"]],
        [["苏3", "南3"], ["大3", "叔3"]],
    ]
)
print(np.transpose(sn))
print(np.array_equal(sn.T, np.transpose(sn)))

苏南大叔:如何使用transpose转置ndarray矩阵?与T属性有何不同? - 三维数组转置
如何使用transpose转置ndarray矩阵?与T属性有何不同?(图8-4)

axes轴的概念

在前面的文章里面,苏南大叔画了一张图,显示的是三维矩阵下的"0轴"/"1轴"/"2轴"的简单推理。

苏南大叔:如何使用transpose转置ndarray矩阵?与T属性有何不同? - 轴的概念
如何使用transpose转置ndarray矩阵?与T属性有何不同?(图8-5)

这个理论依据就是从下面的公式里面推导出来的。

import numpy as np
sn  = np.arange(27).reshape(3, 3, 3)      # 3*3*3的三维数组
sn_ = np.transpose(sn, axes=(0, 1, 2))    # 正常原版
print(sn, sn_, np.array_equal(sn, sn_))

苏南大叔:如何使用transpose转置ndarray矩阵?与T属性有何不同? - 原版三维矩阵
如何使用transpose转置ndarray矩阵?与T属性有何不同?(图8-6)

import numpy as np
sn  = np.arange(27).reshape(3, 3, 3)      # 3*3*3的三维数组
ns  = np.transpose(sn)
ns_ = np.transpose(sn, axes=(2, 1, 0))    # 正常转置
print(ns, ns_, np.array_equal(ns, ns_))

从上面的代码中,苏南大叔可以推断出:

  • 对于三维的ndarray矩阵,axes轴的排序是0\1\2
  • 对于转置的ndarray矩阵,axes轴的排序是2\1\0。也就是说:转置是"0轴"和"2轴"互换。

苏南大叔:如何使用transpose转置ndarray矩阵?与T属性有何不同? - 转置三维矩阵轴向
如何使用transpose转置ndarray矩阵?与T属性有何不同?(图8-7)

numpy.transpose().T不同之处

numpy.transpose().T的微小不同之处,就体现在下面这个函数里面了。如果你已经理解了三维矩阵中轴的概念,那么,下面的这个操作,也应该比较好理解。

  • .T交换的是0轴2轴
  • numpy.transpose()还可以交换0轴1轴
import numpy as np
sn = np.arange(27).reshape(3, 3, 3)     # 3*3*3的三维数组
ns3 = np.transpose(sn, axes=(1, 0, 2))  # 烧脑操作
print(ns3)
print(ns, ns_, np.array_equal(ns.T, ns_))

苏南大叔:如何使用transpose转置ndarray矩阵?与T属性有何不同? - 不同的轴序
如何使用transpose转置ndarray矩阵?与T属性有何不同?(图8-8)

当然根据排列组合算法,3个人坐3个座位,组合数是3*2=6,所以,还有三种不同的组合,大家可以自行实验后续的组合。

结束语

本文结论就是:不到情非得已,请使用.T属性来获得转置矩阵。如果需要特殊定制的轴对换情形,可以考虑numpy.transpose()外加axes=()定义轴顺序的情况。

更多python相关经验文章,请参考:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python