【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` 方法以及 `.T` 属性。以下是关于这些功能的具体说明和示例。 #### 基本概念 在 Numpy 中,`transpose` 是一种用于改变多维数组轴排列顺序的操作。对于二维数组而言,它通常表示行列互换;而对于更高维度的数组,则可以通过指定新的轴顺序实现复杂的维度变换[^1]。 #### 使用方法 - **`.T` 属性**: 这是最简单的转置形式,适用于任何形状的数组。当应用于二维数组时,效果等同于将行变为列,反之亦然。 ```python import numpy as np arr = np.array([[1, 2], [3, 4]]) print(arr.T) # 输出: # [[1 3] # [2 4]] ``` - **`np.transpose(array)` 或者 `array.transpose()`**: 更灵活的方式可以接受额外参数来自定义各轴的新位置。如果不提供具体参数,默认行为似于 `.T` 的作用机制[^2]。 ```python arr_3d = np.random.rand(2, 3, 4) transposed_arr = arr_3d.transpose((1, 2, 0)) print(transposed_arr.shape) # 结果应为 (3, 4, 2) ``` 上述例子展示了三维数据结构经过重新排序后的形态变化过程。这里 `(1, 2, 0)` 定义了一个新次序使得原第二轴成为首轴等等[^3]。 另外值得注意的是,在某些特殊情况下比如处理一维向量的时候,即使进行了所谓的“转置”,其实际表现可能并不会发生明显的变化因为本质上只有一个方向可言[^5]: ```python vector = np.array([1, 2, 3]) print(vector.transpose()) # 返回仍是 [1, 2, 3] ``` 最后还有一种替代方案即利用 Python 内建的功能——列表推导式完成似的任务不过这仅限于简单场景下并不推荐作为常规做法除非必要。 综上所述,无论是初学者还是资深开发者都可以借助强大的 Numpy 工具轻松搞定各种型的数值型数据转换需求!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值