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

本文依然讨论ndarray矩阵转置的问题,最推荐的办法仍然是使用.T属性,并不推荐上文的numpy.transpose(),也并不推荐本文的ndarray.swapaxes()方法(虽然本文的.swapaxes()也可以实现转置需求)。

苏南大叔:ndarray矩阵,如何使用swapaxes方法交换轴数据? - swapaxes
ndarray矩阵,如何使用swapaxes方法交换轴数据?(图5-1)

大家好,这里是苏南大叔的“程序如此灵动”博客,本文讨论ndarray矩阵转置的另外一个可能的方案:ndarray.swapaxes()。测试环境:win10python@3.11.0numpy@1.24.2pandas@1.5.3.swapaxes()是定义在ndarray类型上的,并不是直接定义在numpy库上的。所以,使用的时候,注意区分。

swapaxes,swap(交换) + axes(轴)。

前文回顾

关于矩阵转置这个需求,大概率情况下,推荐读者使用.T属性,参考文章:

也可以使用numpy.transpose()方法,参考文章:

本文提出了第三个可能的解决方案:ndarray.swapaxes()。这个方法需要至少两个参数,所以,理论上来说,至少两个轴才能使用这个方法。但是,一维数组并不会报错,因为可以传一样的轴序号。

翻转矩阵

有轴就可以翻转,有轴就可以转置。

一维数组转置

一维数组也有轴,是个零轴。所以,也可以翻转转置,虽然一如既往的没有啥意义。

import numpy as np

sn = np.arange(27).reshape(-1)
print( sn )
print( sn.swapaxes(0,0) )      # 一维数组只有一个0轴,没有意义

苏南大叔:ndarray矩阵,如何使用swapaxes方法交换轴数据? - 一维数组转置
ndarray矩阵,如何使用swapaxes方法交换轴数据?(图5-2)

二维数组转置

二维数组的话,就两个轴,即使不知道哪个是零轴,哪个是一轴,这也没有关系,都是一样的结果。

import numpy as np

sn = np.arange(27).reshape(-1,3)
print( sn )
print( sn.swapaxes(0,1) )      # 二维数组翻转

苏南大叔:ndarray矩阵,如何使用swapaxes方法交换轴数据? - 二维数组转置
ndarray矩阵,如何使用swapaxes方法交换轴数据?(图5-3)

三维矩阵转置

import numpy as np

sn = np.arange(27).reshape(-1, 3, 3)
ns1 = sn.T
ns2 = np.transpose(sn, axes=(2, 1, 0))  
ns3 = sn.swapaxes(2, 0)  # 三维矩阵翻转,参数顺序其实无关
ns4 = sn.swapaxes(0, 2)  # 三维矩阵翻转,参数顺序其实无关

print( np.array_equal(ns1, ns3) )
print( np.array_equal(ns2, ns3) )
print( np.array_equal(ns3, ns4) )

苏南大叔:ndarray矩阵,如何使用swapaxes方法交换轴数据? - 三维矩阵转置
ndarray矩阵,如何使用swapaxes方法交换轴数据?(图5-4)

在以前的文章里面,已经得出结论:ndarray三维矩阵的转置,就是二轴和零轴的互换。而.swapaxes()两个参数谁前谁后,完全没有关系。所以,这里有很多个相同的结果。

.swapaxes()的不同之处

numpy.transpose()一样,这里的ndarray.swapaxes()也是有特殊的用武之地的。测试代码:

import numpy as np

sn = np.arange(27).reshape(-1, 3, 3)
ns5 = sn.swapaxes(1, 0)  # 三维矩阵翻转
ns6 = np.transpose(sn, axes=(1, 0, 2))
ns7 = np.transpose(sn, axes=(0, 1, 2))
print( np.array_equal(ns5, ns6) )
print( np.array_equal(ns5, ns7) )

苏南大叔:ndarray矩阵,如何使用swapaxes方法交换轴数据? - swapaxes特殊之处
ndarray矩阵,如何使用swapaxes方法交换轴数据?(图5-5)

虽然.swapaxes()两个参数没有前后之分,但是.transpose(axes=())axes是定义的顺序,是有前后之分的。所以,对于三维矩阵的.swapaxes()来说,组合数是3。.transpose来说,排列数是6。

结束语

更多苏南大叔写的python经验文章,请点击:

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

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

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

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