如何使用transpose转置ndarray矩阵?与T属性有何不同?
发布于 作者:苏南大叔 来源:程序如此灵动~
继续ndarray矩阵翻转的问题,在前面的文章中,是使用.T属性来解决这个问题的,简单好用省力。本文介绍另外一种方法,是基于numpy的transpose()方法。它的作用和.T是一致的,绝大多数情况下,都是可以互换的。那么,numpy.transpose()又有什么特别的用法么?这就是本文要讨论的问题。

大家好,这里是苏南大叔的“程序如此灵动”博客,本文讨论numpy.transpose()方法。测试环境:win10,python@3.11.0,numpy@1.24.2,pandas@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)))
转置二维数组:
import numpy as np
sn = np.array([["苏", "南"], ["大", "叔"]])
print(np.transpose(sn))
print(np.array_equal(sn.T, np.transpose(sn)))
转置三维矩阵:
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)))
axes轴的概念
在前面的文章里面,苏南大叔画了一张图,显示的是三维矩阵下的"0轴"/"1轴"/"2轴"的简单推理。

这个理论依据就是从下面的公式里面推导出来的。
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_))
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轴"互换。

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_))
当然根据排列组合算法,3个人坐3个座位,组合数是3*2=6,所以,还有三种不同的组合,大家可以自行实验后续的组合。
结束语
本文结论就是:不到情非得已,请使用.T属性来获得转置矩阵。如果需要特殊定制的轴对换情形,可以考虑numpy.transpose()外加axes=()定义轴顺序的情况。
更多python相关经验文章,请参考: