numpy数组中的转置方法

3duebb1j  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(78)

假设我有一个numpy数组,其中:
第一个月

array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7]],

       [[ 8,  9, 10, 11],
        [12, 13, 14, 15]]])

字符串
我使用transpose方法,它接受一个轴编号的元组来排列轴:
np.transpose((1, 0, 2))

array([[[ 0,  1,  2,  3],
        [ 8,  9, 10, 11]],

       [[ 4,  5,  6,  7],
        [12, 13, 14, 15]]])


在这种情况下,transpose是如何执行操作的?轴操作是如何发生的?

mftmpeh8

mftmpeh81#

In [226]: x=np.arange(16).reshape((2, 2, 4))
In [227]: y=x.transpose(1,0,2)
In [228]: z=x.transpose(0,2,1)
In [229]: x
Out[229]: 
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7]],

       [[ 8,  9, 10, 11],
        [12, 13, 14, 15]]])
In [230]: y
Out[230]: 
array([[[ 0,  1,  2,  3],
        [ 8,  9, 10, 11]],

       [[ 4,  5,  6,  7],
        [12, 13, 14, 15]]])

字符串
前两个维度已切换。这有点难以想象,因为它们是“平面”和“行”维度。列,最后一个保持不变。

In [231]: z
Out[231]: 
array([[[ 0,  4],
        [ 1,  5],
        [ 2,  6],
        [ 3,  7]],

       [[ 8, 12],
        [ 9, 13],
        [10, 14],
        [11, 15]]])


交换最后两个维度更容易可视化。旋转2个平面-行为列

In [232]: x.strides
Out[232]: (64, 32, 8)
In [233]: y.strides
Out[233]: (32, 64, 8)
In [235]: z.strides
Out[235]: (64, 8, 32)


对于x,步幅朝向前导维度增加。8表示最后的列,一次一个元素。32是4*8,每行4个元素。最后2*32用于平面。
对于y,平面和行尺寸已切换。对于z,行和列维度已切换。
现在,yzcopy将步幅恢复为常规的C顺序。
如果三维空间都不同,转置在形状上非常明显:

In [236]: np.arange(24).reshape(2,3,4).shape
Out[236]: (2, 3, 4)
In [237]: np.arange(24).reshape(2,3,4).transpose(1,0,2).shape
Out[237]: (3, 2, 4)
In [238]: np.arange(24).reshape(2,3,4).transpose(2,1,0).shape
Out[238]: (4, 3, 2)
In [239]: np.arange(24).reshape(2,3,4).transpose(0,2,1).shape
Out[239]: (2, 4, 3)

相关问题