NumPy 2.x 完全指南【十七】转置操作

news2025/5/24 16:48:06

文章目录

  • 1. 什么是转置
  • 2. 转置操作
    • 2.1 transpose
    • 2.2 ndarray.T
    • 2.3 moveaxis
    • 2.4 rollaxis
    • 2.5 permute_dims
    • 2.6 swapaxes
    • 2.7 matrix_transpose

1. 什么是转置

在线性代数中,矩阵转置是指将矩阵的行和列进行互换,即原矩阵的第 i i i 行、第 j j j 列元素,在转置后变为第 j j j 行、第 i i i 列元素。给定一个 m × n m \times n m×n 的矩阵 A A A,其转置矩阵 A T A^T AT 是一个 n × m n \times m n×m 的矩阵,满足:
( A T ) i j = A j i (A^T)_{ij} = A_{ji} (AT)ij=Aji

示例, 原矩阵 A A A
A = [ 1 2 3 4 5 6 ] ( 2 × 3 ) A = \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{bmatrix} \quad (2 \times 3) A=[142536](2×3)

转置矩阵 A T A^T AT 为:
A T = [ 1 4 2 5 3 6 ] ( 3 × 2 ) A^T = \begin{bmatrix} 1 & 4 \\ 2 & 5 \\ 3 & 6 \end{bmatrix} \quad (3 \times 2) AT= 123456 (3×2)

具体表现为:

  • 原矩阵的第 1 行 转置矩阵的第 1 列
  • 原矩阵的第 2 行 转置矩阵的第 2 列
  • 以此类推

在高维数组中,转置的操作更加灵活,可以:

  • 完全反转所有轴的顺序(默认行为)。
  • 自定义轴的排列顺序(如指定轴的交换顺序)。

在机器学习中转置常用于:

  • 调整图像数据的通道顺序。
  • 将时间序列数据从 (序列长度, 特征数) 转为 (特征数, 序列长度)。
  • 神经网络中的权重矩阵维度匹配。
  • 卷积操作中的滤波器方向调整。

2. 转置操作

2.1 transpose

transpose()(转置):通过轴的重新排列改变数组的维度结构(默认返回视图)。

函数、方法定义:

# 函数
def transpose(a, axes=None)
# 方法
def transpose(self, axes: None | _ShapeLike, /) -> Self: ...

参数说明:

  • a:输入数组(支持任意维度)。
  • axes:指定新轴的排列顺序。

不同维度的行为说明:

数组维度默认行为(无 axes 参数)说明
1-D返回原数组的视图无实际转置操作,仍是 1D 数组,仅改变数组的 strides 属性)
2-D标准矩阵转置行列互换
n-D反转所有轴的顺序原轴顺序 (0,1,2) 变为 (2,1,0)

示例 1 ,转置二维数组:

# 二维数组
arr_2d = np.array([[1, 2, 3],
                   [4, 5, 6]])

# 转置
# 函数调用
transposed_2 = np.transpose(arr_2d)
print(transposed_2)
# 输出:
#[[1 4]
# [2 5]
# [3 6]]

# 方法调用
transposed_1 = arr_2d.transpose()
print(transposed_1)

注意:转置后内存共享,修改转置后的元素会影响原数组:

# 修改转置矩阵元素
transposed_2[1, 1] = 99 # 第二行第二列修改为 5-> 99
print(arr_2d)
# 原数组被修改
# [[ 1  2  3]
#  [ 4 99  6]]

示例 2 ,三维数组:

arr_3d = np.arange(24).reshape(2, 3, 4)  # 形状 (2, 3, 4)
print(arr_3d)
# [[[ 0  1  2  3]
#   [ 4  5  6  7]
#   [ 8  9 10 11]]
#
#  [[12 13 14 15]
#   [16 17 18 19]
#   [20 21 22 23]]]

# 转置
transposed = np.transpose(arr_3d)
print(transposed.shape)  # 形状(4,3,2)
print(transposed)
# [[[ 0 12]
#   [ 4 16]
#   [ 8 20]]
#
#  [[ 1 13]
#   [ 5 17]
#   [ 9 21]]
#
#  [[ 2 14]
#   [ 6 18]
#   [10 22]]
#
#  [[ 3 15]
#   [ 7 19]
#   [11 23]]]

转置过程的核心是轴顺序的变化,每个元素的索引按新轴顺序重组,例如三维数组的转置公式为:
( A T ) i j k = n e w A k j i (A^T)_{ijk} = newA_{kji} (AT)ijk=newAkji
示例:

  • A[0,0,0] -> newA[0,0,0]
  • A[0,0,1] -> newA[1,0,0]
  • A[1,2,3] -> newA[3,2,1]
  • 依次映射所有元素

比如,案例中的三维数据,A[1,2,3] 索引即第二层第三行第四列的元素为 23 ,转置后放在 newA[3,2,1] 即第四层第三行第二列,可以看下转置后的输出,也是 23

示例 3 ,有一个形状为 (2, 3, 4) 的三维数组,轴的顺序为 (0, 1, 2) ,那么 axes 参数是包含三个整数的元组,然后可以设置不同轴顺序:

axes 参数转置后形状转置规则(原轴顺序 → 新轴顺序)示例元素映射(原位置 → 新位置)
默认(None(4, 3, 2)(0, 1, 2) → (2, 1, 0)arr[1, 2, 3] → new[3, 2, 1]
(0, 1, 2)(2, 3, 4)无变化arr[1, 0, 0] → new[1, 0, 0]
(1, 0, 2)(3, 2, 4)交换块(0轴)和行(1轴)arr[1, 2, 3] → new[2, 1, 3]
(0, 2, 1)(2, 4, 3)交换行(1轴)和列(2轴)arr[0, 1, 2] → new[0, 2, 1]
(2, 0, 1)(4, 2, 3)列→块→行arr[1, 0, 0] → new[0, 1, 0]
(2, 1, 0)(4, 3, 2)反转所有轴(等价默认)arr[0, 2, 3] → new[3, 2, 0]
(1, 2, 0)(3, 4, 2)行→列→块arr[1, 0, 0] → new[0, 0, 1]

代码示例:

arr = np.arange(24).reshape(2, 3, 4) # shape (4, 3, 2)
print(arr)
# [[[ 0  1  2  3]
#   [ 4  5  6  7]
#   [ 8  9 10 11]]
#
#  [[12 13 14 15]
#   [16 17 18 19]
#   [20 21 22 23]]]

transposed = np.transpose(arr, axes=(1, 0, 2))
print(transposed)  # shape (3, 4, 2)
# [[[ 0  1  2  3]
#   [12 13 14 15]]
# 
#  [[ 4  5  6  7]
#   [16 17 18 19]]
# 
#  [[ 8  9 10 11]
#   [20 21 22 23]]]

扩展,在计算机视觉领域,图像通常以多维数组存储,比如彩色图的两种格式:

  • HWCHeight, Width, Channels):即(高度, 宽度, 通道)
  • CHWChannels, Height, Width):即(通道, 高度, 宽度)

在模型训练和预测的过程中,往往会涉及到格式转换,比如 OpenCV 读取图像的格式为 HWCPyTorch 要求的格式是 CHW ,需要在数据内容不变的情况下,整存储顺序,适配不同框架的计算需求。

一个常用的代码片如下:

# 读取图片(HWC格式)
img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)

# 转换为 CHW 格式(使用 copy ,防止转置后的视图与原数组共享内存,避免意外的修改。)
img_chw = np.transpose(img_rgb.copy(), (2, 0, 1))

2.2 ndarray.T

NumPy 还提供了一个是一个数组对象的转置属性,即 arr.T ,等价于调用 np.transpose(arr),默认反转数组的所有轴。

示例:

arr_3d = np.arange(24).reshape(2, 3, 4)
print("原形状:", arr_3d.shape)  # (2, 3, 4)

transposed_3d = arr_3d.T
print("转置后形状:", transposed_3d.shape)  # (4, 3, 2)

2.3 moveaxis

numpy.moveaxis:将指定轴移动到目标位置,其他轴按原有顺序自动排列。

函数定义:

def moveaxis(a, source, destination)

参数说明:

  • a:输入的多维数组。
  • source:要移动的轴的原始位置。
  • destination:移动后的目标位置。

注意事项:

  • transpose 函数的一个特例。
  • 返回原数组的视图
  • 支持同时移动多个轴到不同目标位置
  • 目标位置按以下规则处理:
    • 正索引:从左到右(0 开始)。
    • 负索引:从右到左(-1 表示最后一个位置)。

示例 1 ,移动 0 轴到末尾,形状由 (3,4,5) 变为 (4,5,3),元素 a[x,y,k] 依次重新排入到 a[y,k,x] 的索引位置:

x = np.arange(60).reshape(3, 4, 5)  # shape (3,4,5)
print(x)
# [[[ 0  1  2  3  4]
#   [ 5  6  7  8  9]
#   [10 11 12 13 14]
#   [15 16 17 18 19]]
#
#  [[20 21 22 23 24]
#   [25 26 27 28 29]
#   [30 31 32 33 34]
#   [35 36 37 38 39]]
#
#  [[40 41 42 43 44]
#   [45 46 47 48 49]
#   [50 51 52 53 54]
#   [55 56 57 58 59]]]
# 移动轴 0 到末尾
y = np.moveaxis(x, 0, -1)  # shape (4,5,3)
print(y)
# [[[ 0 20 40]
#   [ 1 21 41]
#   [ 2 22 42]
#   [ 3 23 43]
#   [ 4 24 44]]
#
#  [[ 5 25 45]
#   [ 6 26 46]
#   [ 7 27 47]
#   [ 8 28 48]
#   [ 9 29 49]]
#
#  [[10 30 50]
#   [11 31 51]
#   [12 32 52]
#   [13 33 53]
#   [14 34 54]]
#
#  [[15 35 55]
#   [16 36 56]
#   [17 37 57]
#   [18 38 58]
#   [19 39 59]]]

同时移动多个轴时,原位置和目标位置都是数组,且需要保持依次对应关系。示例 2 ,同时移动轴 0 和轴 1 到新位置,即 0 移动到末尾,1 移动到倒数第二位置:

x = np.arange(60).reshape(3, 4, 5)  # shape (3,4,5)
y = np.moveaxis(x, [0, 1],
                [-1, -2])  # shape (5,4,3)
print(y)
# [[[ 0 20 40]
#   [ 5 25 45]
#   [10 30 50]
#   [15 35 55]]
#
#  [[ 1 21 41]
#   [ 6 26 46]
#   [11 31 51]
#   [16 36 56]]
#
#  [[ 2 22 42]
#   [ 7 27 47]
#   [12 32 52]
#   [17 37 57]]
#
#  [[ 3 23 43]
#   [ 8 28 48]
#   [13 33 53]
#   [18 38 58]]
#
#  [[ 4 24 44]
#   [ 9 29 49]
#   [14 34 54]
#   [19 39 59]]]

2.4 rollaxis

numpy.rollaxis():将指定轴滚动到目标位置,其他轴的相对顺序保持不变。

函数定义:

def rollaxis(a, axis, start=0)

注意事项: 仅为了向后兼容性考虑,建议优先使用moveaxis,所有这里就不演示了。

2.5 permute_dims

numpy.permute_dims():通过轴的重新排列改变数组的维度结构(默认返回视图)。

函数定义:

def rollaxis(a, axis, start=0)

提示: permute_dimstranspose 的别名函数,功能完全等效。

2.6 swapaxes

swapaxes():交换数组的两个指定轴,调整数据的维度顺序而不改变数据本身。

函数、方法定义:

# 函数
def swapaxes(a, axis1, axis2):
# 方法
def swapaxes(
    self,
    axis1: SupportsIndex,
    axis2: SupportsIndex,
) -> ndarray[_Shape, _DType_co]: ...

参数说明:

  • a:输入的多维数组。
  • axis1:第一个待交换的轴索引。
  • axis2:第二个待交换的轴索引。

在之前我们学过转置函数(transpose),可以控制所有轴的顺序,而 swapaxes 可以看成它的一个特例,是一种只交换两个轴的操作。

示例 1 ,二维数组交换交换 0 轴和 1 轴:

import numpy as np

x = np.array([[1, 2], [3, 4]])  # shape (2, 2)
y = np.swapaxes(x, 0, 1)  # 交换轴 0 和轴 1
print(y)
# 输出:
# [[1 3]
#  [2 4]]

示例 2 ,三维数组交换交换 0 轴和 2 轴,轴顺序由(0,1,2)变为(2,1,0),元素 a[x,y,k] 依次重新排入到 a[k,y,x] 的索引位置:

x = np.array([[[0, 1], [2, 3]],
              [[4, 5], [6, 7]]])  # shape (2, 2, 2)
y = np.swapaxes(x, 0, 2)  # 交换轴 0(外层)和轴 2(内层)
print(y)
# 输出:
# [[[0, 4],
#   [2, 6]],
#  [[1, 5],
#   [3, 7]]]

2.7 matrix_transpose

numpy.matrix_transpose():专为转置矩阵或批量矩阵设计的函数,仅交换输入数组的最后两个维度,其他维度保持不变。适用于遵循 Array API 标准的操作。

函数定义:

def matrix_transpose(x, /)

参数说明:

  • x:输入的类数组对象,形状为 (..., M, N),其中 ... 表示任意数量的前置维度,最后两个维度 MN 构成矩阵。

返回值:

  • outndarray 类型,形状为 (..., N, M)。每个最后两维的矩阵 M×N 被转置为 N×M,前置维度完全保留。

注意事项:

  • 仅转置最后两个维度,无论输入数组维度多高,只交换最后两个轴。
  • 适合处理堆叠的矩阵(如多个样本、多个通道的数据)。
  • 遵循 Array API 标准,行为与其他框架(如 PyTorchTensorFlow)一致。

示例 1 ,二维矩阵转置:

x = [[1, 2], [3, 4]]  # 形状 (2, 2)
y = np.matrix_transpose(x)
print(y)
# [[1, 3],
#  [2, 4]]

示例 2 ,三维矩阵转置时,每个矩阵独立转置,前置维度(第一维)保持不变:

x = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]  # 形状 (2, 2, 2)
y = np.matrix_transpose(x)
print(y)
# [[[1, 3],  # 第一个矩阵转置
#   [2, 4]],
#  [[5, 7],  # 第二个矩阵转置
#   [6, 8]]]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2384736.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据架构04】数据湖架构篇

✅ 10张高质量数据治理架构图 无论你是数据架构师、治理专家,还是数字化转型负责人,这份资料库都能为你提供体系化参考,高效解决“架构设计难、流程不清、平台搭建慢”的痛点! 🌟限时推荐,速速收藏&#…

uniapp-商城-62-后台 商品列表(分类展示商品的布局)

每一个商品都有类别,比如水果,蔬菜,肉,粮油等等,另外每一个商品都有自己的属性,这些都在前面的章节进行了大量篇幅的介绍。这里我们终于完成了商品类的添加,商品的添加,现在到了该进…

初识C++:模版

本篇博客主要讲解C模版的相关内容。 目录 1.泛型编程 2.函数模板 2.1 函数模版概念 2.2 函数模版格式 2.3 函数模版的原理 2.4 函数模版的实例化 1.隐式实例化&#xff1a;让编译器根据实参推演模板参数的实际类型 2. 显式实例化&#xff1a;在函数名后的<>中指定模…

突破认知边界:神经符号AI的未来与元认知挑战

目录 一、神经符号AI的核心领域与研究方法 &#xff08;一&#xff09;知识表示&#xff1a;构建智能世界的语言 &#xff08;二&#xff09;学习与推理&#xff1a;让机器“思考”与“学习” &#xff08;三&#xff09;可解释性与可信度&#xff1a;让AI更透明 &#xf…

Java 处理地理信息数据[DEM TIF文件数据获取高程]

目录 1、导入依赖包 2、读取方法 3、其他相关地理信息相关内容&#xff1a; 1️⃣常用的坐标系 1、GIS 中的坐标系一般分为两大类&#xff1a; 2. ✅常见的地理坐标系 2.0 CGCS2000&#xff08;EPSG:4490&#xff09; 2.1 WGS84 (World Geodetic System 1984) &#xff08;EPSG…

谈谈对dubbo的广播机制的理解

目录 1、介绍 1.1、广播调用 1、工作原理 1.2、调用方式 1、Reference 注解 2、XML 配置 3、全局配置 1.3、 广播机制的特性 2、重试机制 2.1、默认行为 2.2、自定义逻辑 1、在业务层封装重试逻辑 2、使用 Reference 3、广播调用的实践 3.1、常用参数 1.…

003-类和对象(二)

类和对象&#xff08;二&#xff09; 1. 类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 默认成员函数&#xff…

Linux火墙管理及优化

网络环境配置 使用3个新的虚拟机【配置好软件仓库和网络的】 F1 192.168.150.133 NAT F2 192.168.150.134 192.168.10.20 NAT HOST-ONLY 网络适配仅主机 F3 192.168.10.30 HOST-ONLY 网络适配仅主机 1 ~]# hostnamectl hostname double1.timinglee.org 【更…

Visual Studio 制作msi文件环境搭建

一、插件安装 a. 插件寻找 在 Visual Studio 2017 中&#xff0c;如果你希望安装用于创建 MSI 安装包的插件&#xff0c;第一步是&#xff1a;打开 Visual Studio 后&#xff0c;点击顶部菜单栏中的 “工具”&#xff08;Tools&#xff09;&#xff0c;然后选择下拉菜单中的 “…

鸿蒙进阶——Framework之Want 隐式匹配机制概述

文章大纲 引言一、Want概述二、Want的类型1、显式Want2、隐式Want3、隐式Want的匹配 三、隐式启动Want 源码概述1、有且仅有一个Ability匹配2、有多个Ability 匹配需要弹出选择对话框3、ImplicitStartProcessor::ImplicitStartAbility3.1、GenerateAbilityRequestByAction3.1.1…

antv/g6 图谱封装配置(二)

继上次实现图谱后&#xff0c;后续发现如果要继续加入不同样式的图谱实现起来太过麻烦&#xff0c;因此考虑将配置项全部提取封装到js文件中&#xff0c;图谱组件只专注于实现各种不同的组件&#xff0c;其中主要封装的点就是各个节点的横坐标&#xff08;x&#xff09;,纵坐标…

OpenCV CUDA模块图像过滤------用于创建一个最小值盒式滤波器(Minimum Box Filter)函数createBoxMinFilter()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数创建的是一个 最小值滤波器&#xff08;Minimum Filter&#xff09;&#xff0c;它对图像中每个像素邻域内的像素值取最小值。常用于&…

网络抓包命令tcpdump及分析工具wireshark使用

文章目录 环境文档用途详细信息 环境 系统平台&#xff1a;Linux x86-64 Red Hat Enterprise Linux 8,Linux x86-64 Red Hat Enterprise Linux 7,Linux x86-64 SLES 12,银河麒麟 &#xff08;鲲鹏&#xff09;,银河麒麟 &#xff08;X86_64&#xff09;,银河麒麟&#xff08;龙…

车载诊断架构 --- 车载诊断有那些内容(上)

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…

【Hadoop】大数据技术之 HDFS

目录 一、HDFS 概述 1.1 HDFS 产出背景及定义 1.2 HDFS 优缺点 1.3 HDFS 组成架构 1.4 HDFS 文件块大小 二、HDFS 的Shell 操作 三、HDFS 的读写流程&#xff08;面试重点&#xff09; 3.1 HDFS 写数据流程 3.2 HDFS 读数据流程 四、DataNode 4.1 DataNode 的工作机制…

聊一下CSS中的标准流,浮动流,文本流,文档流

在网络上关于CSS的文章中&#xff0c;有时候能听到“标准流”&#xff0c;“浮动流”&#xff0c;“定位流”等等词语&#xff0c;还有像“文档流”&#xff0c;“文本流”等词&#xff0c;这些流是什么意思&#xff1f;它们是CSS中的一些布局方案和特性。今天我们就来聊一下CS…

ATGM332D-F8N22单北斗多频定位导航模块

ATGM332D-F8N 系列模块是 12.216mm 尺寸的高性能单北斗多频定位导航模块。该系列模块产品基于中科微新一代 SOC 单北斗多频芯片 AT9880B&#xff0c;支持北斗二号和北斗三号的 B1I、B1C、B2I、B3I、B2a 和 B2b 频点信号。 主要特征 多频点单北斗接收机 支持北斗二号、北斗三号…

2024年热门AI趋势及回顾

人工智能的崛起 2024 年可能会被铭记为人工智能不再是一种技术新奇事物&#xff0c;而是成为现实的一年。微软、Salesforce 和 Intuit 等巨头将人工智能融入主流企业解决方案&#xff1b;从文案写作到数据分析&#xff0c;专门的人工智能应用程序和服务如雨后春笋般涌现&#…

3. OpenManus-RL中使用AgentGym建立强化学习环境

AgentGym概述 AgentGym是为评估和开发大模型agent而设计的支持多环境和多任务的框架。该框架统一采用ReAct格式&#xff0c;提供多样化的交互环境和任务&#xff0c;支持实时反馈和并发操作。 What is Ai Agent&#xff08;基于大模型的智能体&#xff09;? 首先是人造实体&…

C++性能测试工具——sysprof的使用

一、sysprof sysprof相对于前面的一些性能测试工具来说&#xff0c;要简单不少。特别是其图形界面的操作&#xff0c;非常容易上手&#xff0c;它还支持分析文件的保存和导入功能&#xff0c;这是一个非常不错的功能。做为一款系统性能测试工具&#xff0c;它支持多种硬件平台…