【Numpy】类转置操作

前言

本篇总结、介绍Numpy数组(ndarray)的基本操作之一——类转置操作 [1]

1. moveaxis

numpy.moveaxis(a, source, destination):将数组(a)的轴(source)移动到新的位置(destination),其他轴维持原有顺序不变

  • a:类数组
  • source:整数或整数序列。待移动的轴的原始位置
  • destination:整数或整数序列。待移动的轴要移动到的位置
>>> arr = np.arange(24).reshape(2,3,4)
>>> arr
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]]])

>>> np.moveaxis(arr,0,2)
array([[[ 0, 12],
        [ 1, 13],
        [ 2, 14],
        [ 3, 15]],

       [[ 4, 16],
        [ 5, 17],
        [ 6, 18],
        [ 7, 19]],

       [[ 8, 20],
        [ 9, 21],
        [10, 22],
        [11, 23]]])
>>> np.moveaxis(arr,0,2).shape
(3, 4, 2)

>>> np.moveaxis(arr,0,1)
array([[[ 0,  1,  2,  3],
        [12, 13, 14, 15]],

       [[ 4,  5,  6,  7],
        [16, 17, 18, 19]],

       [[ 8,  9, 10, 11],
        [20, 21, 22, 23]]])
>>> np.moveaxis(arr,0,1).shape
(3, 2, 4)

>>> np.moveaxis(arr,1,2)
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]]])
>>> np.moveaxis(arr,1,2).shape
(2, 4, 3)

>>> np.moveaxis(arr,(0,1),(1,2))
array([[[ 0,  4,  8],
        [12, 16, 20]],

       [[ 1,  5,  9],
        [13, 17, 21]],

       [[ 2,  6, 10],
        [14, 18, 22]],

       [[ 3,  7, 11],
        [15, 19, 23]]])
>>> np.moveaxis(arr,(0,1),(1,2)).shape
(4, 2, 3)

2. rollaxis

numpy.rollaxis(a, axis, start=0):向后滚动特定的轴到一个特定位置

  • a:类数组。输入数组
  • axis:整数。要向后滚动的轴,其它轴的相对位置不会改变
  • start:整数,可选参数。指示上述轴要滚动到的特定位置
    • 如果start <= axis:axis指定的轴滚动到start指定的位置
    • 如果start > axis:axis指定的轴滚动到start指定的前一个位置
>>> arr = np.arange(24).reshape(1,2,3,4)
>>> arr
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]]]])

>>> np.rollaxis(arr,1,3)
array([[[[ 0,  1,  2,  3],
         [12, 13, 14, 15]],

        [[ 4,  5,  6,  7],
         [16, 17, 18, 19]],

        [[ 8,  9, 10, 11],
         [20, 21, 22, 23]]]])
>>> np.rollaxis(arr,1,3).shape
(1, 3, 2, 4)

>>> np.rollaxis(arr,3,1)
array([[[[ 0,  4,  8],
         [12, 16, 20]],

        [[ 1,  5,  9],
         [13, 17, 21]],

        [[ 2,  6, 10],
         [14, 18, 22]],

        [[ 3,  7, 11],
         [15, 19, 23]]]])
>>> np.rollaxis(arr,3,1).shape
(1, 4, 2, 3)

3. swapaxes

numpy.swapaxes(a, axis1, axis2):交换数组的两个轴

  • a:类数组。输入数组
  • axis1:整数。第一个轴
  • axis2:整数。第二个轴
>>> arr = np.arange(24).reshape(1,2,3,4)
>>> arr
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]]]])

>>> np.swapaxes(arr,0,1)
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]]]])

>>> np.swapaxes(arr,0,2)
array([[[[ 0,  1,  2,  3]],

        [[12, 13, 14, 15]]],


       [[[ 4,  5,  6,  7]],

        [[16, 17, 18, 19]]],


       [[[ 8,  9, 10, 11]],

        [[20, 21, 22, 23]]]])

>>> np.swapaxes(arr,0,3)
array([[[[ 0],
         [ 4],
         [ 8]],

        [[12],
         [16],
         [20]]],


       [[[ 1],
         [ 5],
         [ 9]],

        [[13],
         [17],
         [21]]],


       [[[ 2],
         [ 6],
         [10]],

        [[14],
         [18],
         [22]]],


       [[[ 3],
         [ 7],
         [11]],

        [[15],
         [19],
         [23]]]])

4. transpose

numpy.transpose(a, axes=None):反转或置换数组的轴,返回修改后的数组

  • a:类数组。输入数组
    • 一维数组:返回原始数组形状未变的视图
  • axes:整数序列,可选参数
    • 如果指定:axes应该是[0,1,…,a.ndim-1]的一个排列,表示置换后数组的每个轴对应原始数组的哪个轴。例如,[2,0,1]表示置换后数组的第一个轴对应原始数组的第三个轴,置换后数组的第二个轴对应原始数组的第一个轴,置换后数组的第三个轴对应原始数组的第二个轴。假设数组a的形状为(2,3,4),那么numpy.transpose(a,axes=[2,0,1])返回的数组形状为(4,2,3)
    • 如果未指定:axes默认为[a.ndim-1,…,1,0],表示翻转数组的轴的顺序
>>> arr = np.arange(24).reshape(2,3,4)
>>> arr
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]]])

>>> np.transpose(arr)
array([[[ 0, 12],
        [ 4, 16],
        [ 8, 20]],

       [[ 1, 13],
        [ 5, 17],
        [ 9, 21]],

       [[ 2, 14],
        [ 6, 18],
        [10, 22]],

       [[ 3, 15],
        [ 7, 19],
        [11, 23]]])
>>> np.transpose(arr).shape
(4, 3, 2)

>>> np.transpose(arr,axes=[2,0,1])
array([[[ 0,  4,  8],
        [12, 16, 20]],

       [[ 1,  5,  9],
        [13, 17, 21]],

       [[ 2,  6, 10],
        [14, 18, 22]],

       [[ 3,  7, 11],
        [15, 19, 23]]])
>>> np.transpose(arr,axes=[2,0,1]).shape
(4, 2, 3)

Reference

[1]: https://numpy.org/doc/stable/reference/routines.array-manipulation.html
[2]: https://zhuanlan.zhihu.com/p/162874970
### NumPy 中 `transpose()` 方法用于矩阵转置的使用方式 NumPy 提供了灵活的 `transpose()` 方法,用于对数组进行转置操作。该方法支持二维和多维数组,并可以通过参数控制维度排列顺序。 #### 二维数组转置 对于二维数组,默认调用 `.transpose()` 或 `np.transpose(array)` 将执行标准的矩阵转置操作,即将行与列交换[^2]。例如: ```python import numpy as np # 创建一个二维数组 a = np.array([[1, 2], [4, 5], [7, 8]]) # 转置后行变为列 transposed_a = a.transpose() print(transposed_a) ``` 输出结果为: ``` [[1 4 7] [2 5 8]] ``` 此操作常用于线性代数计算或数据格式调整。 #### 多维数组转置 对于三维及以上数组,`transpose()` 允许通过传入一个轴顺序的元组来指定新的维度排列[^3]。例如,假设有一个形状为 `(2, 3, 4)` 的三维数组,可以通过 `array.transpose(1, 0, 2)` 来交换前两个维度,而第三个维度保持不变: ```python # 创建一个三维数组 A = np.arange(24).reshape(2, 3, 4) # 调整维度顺序,将第一个和第二个维度交换 T = A.transpose(1, 0, 2) print(T.shape) # 输出 (3, 2, 4) ``` 这种操作在处理图像、张量运算等场景中非常有用,特别是在深度学习中需要适配模型输入要求时。 #### 默认不加参数的转置 当不传递任何参数时,`transpose()` 将完全反转数组的维度顺序。例如,对于一个形状为 `(2, 3, 4)` 的数组,调用 `A.transpose()` 后其形状变为 `(4, 3, 2)`[^1]。 ```python # 默认转置将完全反转维度顺序 T_default = A.transpose() print(T_default.shape) # 输出 (4, 3, 2) ``` 此功能适用于需要彻底重排多维数据结构的场景。 #### `transpose()` 与其他方法的对比 与 `swapaxes(axis1, axis2)` 相比,`transpose()` 更加灵活,因为它允许一次性指定所有维度的新顺序;而 `swapaxes` 仅能交换两个特定维度。此外,对于高维数组,`transpose()` 提供更直观的控制方式[^4]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值