n维矩阵的转置

首先我们需要确定矩阵转置更广泛的定义,n维矩阵具有n个坐标轴。我们假设一个n维矩阵的n个坐标轴依次是a0, a1, a2, a3, ... an-1。对此矩阵的转置可以看作是构建一个新的n维矩阵,但是,要把原先坐标轴的顺序改变一下。这个改变可以是任意的,因此,在定义n维矩阵的转置时必须要定义一下坐标轴的排列顺序。在numpy中,如果没有定义此顺序,则默认的新顺序是原来坐标轴顺序的相反序列,即: an-1, an-2, ... a3, a2, a1。

如果,我们假设转置后的新的坐标轴顺序为at0, at1, at2, ...atn-1。并假设原矩阵为m, 转置后的矩阵为mt。那么,对于新的矩阵中的每一个元素,mt(i0,i1,i2, ...in-1) = m(j0, j1, j2, ..., jn-1), 其中, j0 = iat0, j1 = iat1, ... jn-1 = iatn-1。

简单的举个3维矩阵的例子:

>>> a = np.arange(24).reshape(2,3,4)
>>> a
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])

示例中矩阵a是一个3维矩阵,其中轴0有2个元素,轴1有3个元素,轴2有4个元素。如果我们对此矩阵做轴(0, 2, 1)的转置,则对于新的矩阵而言,存在如下的映射:

mt(0,0,0) = m(0,0,0) = 0
mt(0,0,1) = m(0,1,0) = 4
mt(0,0,2) = m(0,2,0) = 8

mt(0,1,0) = m(0,0,1) = 1
mt(0,1,1) = m(0,1,1) = 5
mt(0,1,2) = m(0,2,1) = 9

mt(0,2,0) = m(0,0,2) = 2
mt(0,2,1) = m(0,1,2) = 6
mt(0,2,2) = m(0,2,2) = 10

mt(0,3,0) = m(0,0,3) = 3
mt(0,3,1) = m(0,1,3) = 7
mt(0,3,2) = m(0,2,3) = 11

mt(1,0,0) = m(1,0,0) = 12
mt(1,0,1) = m(1,1,0) = 16
mt(1,0,2) = m(1,2,0) = 20

mt(1,1,0) = m(1,0,1) = 13
mt(1,1,1) = m(1,1,1) = 17
mt(1,1,2) = m(1,2,1) = 21

mt(1,2,0) = m(1,0,2) = 14
mt(1,2,1) = m(1,1,2) = 18
mt(1,2,2) = m(1,2,2) = 22

mt(1,3,0) = m(1,0,3) = 15
mt(1,3,1) = m(1,1,3) = 19
mt(1,3,2) = m(1,2,3) = 23

通过代码检验以上结果:

>>> a.transpose([0,2,1])
array([[[ 0,  4,  8],
        [ 1,  5,  9],
        [ 2,  6, 10],
        [ 3,  7, 11]],

       [[12, 16, 20],
        [13, 17, 21],
        [14, 18, 22],
        [15, 19, 23]]])

当我们因为应用需求,需要改变矩阵中坐标轴的排列顺序时,则需要使用转置操作。

发表评论

邮箱地址不会被公开。 必填项已用*标注