当前位置: 首页 > news >正文

手撕 `np.transpose` : 三维数组的循环转置

手撕 np.transpose : 三维数组的循环转置

手撕 np.transpose 2D

在这里插入图片描述

  1. 何为transpose ?
    如上图: 二维的例子, 直观地理解就是沿着对角线拉平(对角关系左上右下依旧), 其他位置依次填充.

在这里插入图片描述
2. 2D数组中0,1 为原始参, 1,0 为转置参
- 原始参即数组的原始形态: 比如👆🏻shape为(4,2), 调用元参 即复原原始状态, 即使数组转置本身(自转)也是一样.
- 转置参为转置形态: 👆🏻shape为(2,4), 调用转参 即进入转置状态, 当数组转置本身时, 数组会在(2,4)和(4,2)互相转换. 在2D矩阵中和.T相同 👇
在这里插入图片描述
3. np.flipnp.rot90

  • rot90 : 逆时针躺平(k=1)
  • flip 翻转: 👇🏻shape不变, 翻转180°, 相当于连续rot902次
    在这里插入图片描述

手撕3D转置:

  • 源阵:

arr = np.array([[[11,12,13,14], [21,22,23,24], [31,32,33,34]],[[41,42,43,44], [51,52,53,54], [61,62,63,64]]])
(arr.shape, arr)大-中-小(zyx)
((2, 3, 4),array([[[11, 12, 13, 14],[21, 22, 23, 24],[31, 32, 33, 34]],[[41, 42, 43, 44],[51, 52, 53, 54],[61, 62, 63, 64]]]))

参数2, 轴 (0,1,2)

撕! 撕! 撕!

公转

  • 012zyx
  • shape: 大-中-小
arr012 = np.transpose(arr,(0,1,2))
(arr012.shape, arr012)((2, 3, 4),array([[[11, 12, 13, 14],[21, 22, 23, 24],[31, 32, 33, 34]],[[41, 42, 43, 44],[51, 52, 53, 54],[61, 62, 63, 64]]]))
  • 021zxy
  • shape: 大-小-中
...
((2, 4, 3),array([[[11, 21, 31],[12, 22, 32],[13, 23, 33],[14, 24, 34]],[[41, 51, 61],[42, 52, 62],[43, 53, 63],[44, 54, 64]]]))
  • 120yzx
  • shape: 中-大-小
...
((3, 4, 2),array([[[11, 41],[12, 42],[13, 43],[14, 44]],[[21, 51],[22, 52],[23, 53],[24, 54]],[[31, 61],[32, 62],[33, 63],[34, 64]]]))
  • 102yxz
  • shape: 中-小-大
...
((3, 2, 4),array([[[11, 12, 13, 14],[41, 42, 43, 44]],[[21, 22, 23, 24],[51, 52, 53, 54]],[[31, 32, 33, 34],[61, 62, 63, 64]]]))
  • 201xzy
  • shape: 小-大-中
((4, 2, 3),array([[[11, 21, 31],[41, 51, 61]],[[12, 22, 32],[42, 52, 62]],[[13, 23, 33],[43, 53, 63]],[[14, 24, 34],[44, 54, 64]]]))
  • 210xyz
  • shape: 小-中-大
((4, 3, 2),array([[[11, 41],[21, 51],[31, 61]],[[12, 42],[22, 52],[32, 62]],[[13, 43],[23, 53],[33, 63]],[[14, 44],[24, 54],[34, 64]]]))

自转

  • 数组转置自身时变化:
arr012 = np.transpose(arr012,(0,1,2))
(arr012.shape, arr012)
...
  • 元 参: 012 <-------
  • 一阶转参: 021 <–> 012
  • 一阶转参: 102 <–> 012
  • 一阶转参: 210 <–> 012
  • 二阶转参: 120 --> 201 --> 012 --> 120 …
  • 二阶转参: 201 --> 120 --> 012 --> 201 …

结论:

  1. 3D转置 在本例中, 元参 为012用于还原原始结构, 一阶转参有3个, 在数组转置自身, 会和元参互相转换, 相当于.T (瞎猜的)

  2. 重点来了, 3D矩阵有2个二阶转参很有意思, 在数组转置自身时, 这2个参数会和元参一起构成闭环形成三种转置状态无限循环.

    • 注意⚠️: 顺序是先找到另一个转参, 在通过元参, 找回自身.
  3. 3D转置 本身很抽象, 通过本次手撕实验观察到以下结果:

    • 对角铁律: 在大阵中, 第一个元素和最后一个元素永远是第一个元素和最后一个元素
    • 相邻铁律: 在中阵中,第一个元素和最后一个元素相邻关系不变
    • 相差铁律: 在小阵中, 元素之间的index差值在同一维度永远为1
  • 💡: 本文好几个名词是我自己杜xia撰bian的, 本文是被3D转置搞得头疼又停不下来逼出来的别太当真…
    具体意义, 留待下文分解

<<未完待续>>

http://www.lryc.cn/news/138449.html

相关文章:

  • 计算机竞赛 基于Django与深度学习的股票预测系统
  • CSS 小技能(一):HTML 两个图片竖着平铺、设置图片点击、设置滚动条颜色
  • 【论文阅读】CONAN:一种实用的、高精度、高效的APT实时检测系统(TDSC-2020)
  • P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布
  • 基于Android水果蔬菜果蔬到家商城系统 微信小程序uniAPP的开发与实现
  • 【Python】从入门到上头—Python基础(2)
  • leetcode刷题之283:移动零
  • 【Spring Boot】SpringBoot和数据库交互: 使用Spring Data JPA
  • 自动化部署及监测平台基本架构
  • 基于NXP i.MX 6ULL核心板的物联网模块开发案例(1)
  • 【路由器】小米 WR30U 解锁并刷机
  • 数据库操作语句
  • Mr. Cappuccino的第64杯咖啡——Spring循环依赖问题
  • Adapting Language Models to Compress Contexts
  • Kubernetes(K8S)使用PV和PVC做存储安装mysql
  • Ansible Playbook 常用变量
  • 0103水平分片-jdbc-shardingsphere-中间件
  • Vue2.0+webpack 引入字体文件(eot,ttf,woff)
  • Eureka:CAP原则及对比Zookeeper
  • WPF入门到精通:3.MVVM简单应用及全局异常处理
  • Springboot+mybatis-plus+dynamic-datasource+Druid 多数据源 分布式事务
  • 673. 最长递增子序列的个数
  • Android12之ABuffer数据处理(三十四)
  • whisper 语音识别项目部署
  • 实例044 在关闭窗口前加入确认对话框
  • 子查询和事务隔离以及用户管理
  • uniapp 滚动到指定元素的位置(锚点)
  • Spring AOP 的 afterReturing 返回值是否能修改问题
  • MyBatis分页插件PageHelper的使用及特殊字符的处理
  • [语音识别] 基于Python构建简易的音频录制与语音识别应用