ndarray矩阵,如何使用swapaxes方法交换轴数据?
发布于 作者:苏南大叔 来源:程序如此灵动~本文依然讨论ndarray
矩阵转置的问题,最推荐的办法仍然是使用.T
属性,并不推荐上文的numpy.transpose()
,也并不推荐本文的ndarray.swapaxes()
方法(虽然本文的.swapaxes()
也可以实现转置需求)。
大家好,这里是苏南大叔的“程序如此灵动”博客,本文讨论ndarray
矩阵转置的另外一个可能的方案:ndarray.swapaxes()
。测试环境:win10
,python@3.11.0
,numpy@1.24.2
,pandas@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轴,没有意义
二维数组转置
二维数组的话,就两个轴,即使不知道哪个是零轴,哪个是一轴,这也没有关系,都是一样的结果。
import numpy as np
sn = np.arange(27).reshape(-1,3)
print( sn )
print( sn.swapaxes(0,1) ) # 二维数组翻转
三维矩阵转置
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()
两个参数谁前谁后,完全没有关系。所以,这里有很多个相同的结果。
.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) )
虽然.swapaxes()
两个参数没有前后之分,但是.transpose(axes=())
的axes
是定义的顺序,是有前后之分的。所以,对于三维矩阵的.swapaxes()
来说,组合数是3。.transpose
来说,排列数是6。
结束语
更多苏南大叔写的python
经验文章,请点击:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。