源码侦探:理解 numpy 中的 tile 方法

文章目录

    • pre :先来一张源码的切片
    • 1. 参数和基本定义:
    • 2. 将 reps 转换为元组:
    • 3. 提升数组维度:
    • 4. 特殊情况检查:
    • 5. 处理数组维度的不同情况:
    • 6. 计算输出数组的形状:
    • 7. 通过重复构造数组:(核心部分,也是比较难理解的部分)
    • 8. 返回结果:


pre :先来一张源码的切片

mac中按住cmd,鼠标放到tile函数上点一下就可以进入了,win是按住ctrl点一下。
请添加图片描述
源码部分的介绍非常详细,有一大段部分是注射,还有样例分析。小插曲:这个截图插件叫 Easy Code Screenshots,在JetBrains IDE都可以找到。

1. 参数和基本定义:

  • A: 输入数组,可以是任意形状的数组。
  • reps: 一个数组或整数,表示每个轴的重复次数。例如,如果 reps 是 (2, 3),则会对数组的第一个轴重复两次,第二个轴重复三次。

这里解释一下轴是什么:
在数组和矩阵操作中,轴(axis) 是指数组的维度方向。每个维度(或轴)有一个编号,通常从 0 开始。对于不同维度的数组,轴的概念如下:
一维数组:只有一个轴,即 axis=0。沿这个轴重复会将数组的元素进行平铺。
a = np.array([1, 2, 3]),只有一个轴 axis=0
二维数组:有两个轴,axis=0 表示行方向,axis=1 表示列方向。沿 axis=0 重复就是在行方向上增加行数。沿 axis=1 重复则在列方向上增加列数。
b = np.array([[1, 2], [3, 4]]),axis=0 是行方向,axis=1 是列方向
三维及更高维数组:有多个轴。例如,三维数组的 axis=0 是深度(通常表示“页”),axis=1 是行,axis=2 是列。
c = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]),axis=0 是“页”方向,axis=1 是行方向,axis=2 是列方向
在 tile 函数中,reps 指定了每个轴的重复次数,例如 reps=(2, 3):
2 表示在第一个轴上重复 2 次。
3 表示在第二个轴上重复 3 次。

2. 将 reps 转换为元组:

tup = tuple(reps)
  • 如果 reps 是整数或列表,将其转换为元组 tup,方便在接下来的操作中使用。

3. 提升数组维度:

  • 通过计算 d = len(tup) 得到 reps 的维度数。
  • 如果 A 的维度数少于 d,函数会自动将 A 提升到 d 维。例如,如果 A 是一维数组,但 reps 是 (2, 2),那么会将 A 扩展到二维,变成 (1, n) 的形状。

4. 特殊情况检查:

if all(x == 1 for x in tup) and isinstance(A, _nx.ndarray):
    return _nx.array(A, copy=True, subok=True, ndmin=d)
  • 如果 reps 中所有元素都为 1,且 A 是一个 NumPy 数组,则直接返回 A 的副本,因为这样可以节省不必要的重复计算。
  • 使用 copy=True 创建一个新的副本,以避免对原始数据的修改。

5. 处理数组维度的不同情况:

  • 如果 reps 的维度 d 小于 A 的维度数 c.ndim,函数会通过在 reps 前面补 1 来扩展 tup,从而将 tup 调整到与 A 的维度一致。例如,如果 A 是 (2, 3, 4) 维的数组,reps 是 (2, 2),则将 tup 转换为 (1, 2, 2)。

6. 计算输出数组的形状:

shape_out = tuple(s * t for s, t in zip(c.shape, tup))
  • 输出数组的形状是每个维度上 A.shape 与 reps 的对应值相乘所得。

7. 通过重复构造数组:(核心部分,也是比较难理解的部分)

for dim_in, nrep in zip(c.shape, tup):
    if nrep != 1:
        c = c.reshape(-1, n).repeat(nrep, 0)
    n //= dim_in
  • 使用 repeat 函数沿指定的轴重复元素。这个过程逐步沿每个维度(从最外层到最内层)将数组重复 nrep 次。
  • zip(c.shape, tup) 将输入数组 c 的每个维度的大小和 reps 中的重复次数配对起来,进行逐一处理。
  • dim_in 是当前维度的大小(c.shape 中的一个元素),nrep 是对应的重复次数(tup 中的一个元素)。
  • c.reshape(-1, n) 这一步是为了将数组 c 重新调整形状,使得它的第一个维度为 -1(即自动计算大小),第二个维度为 n(总元素个数)。
  • 例如,如果 c 原本是 (2, 3) 的数组,经过调整后会变成 (1, 6) 的数组,其中 6 是元素个数(2 * 3)。
  • repeat(nrep, 0) 这一步则是在新的形状下沿着第一个轴(行方向)重复 nrep 次。即使经过 reshape, c 的形状会变成 (nrep, 6)。
  • n //= dim_in 更新 n 的值,n 除以当前维度的大小 dim_in。这一步是为了在处理下一个维度时,能得到正确的元素个数。
  • 这样做的原因是,随着每个维度的处理,n 会逐渐减少,因为每次处理一个维度时,元素总数 n 都会被分解成当前维度的大小。

8. 返回结果:

  • 最后,将数组 c 重新调整到 shape_out,并返回该形状的输出数组。

示例分析

>>> a = np.array([0, 1, 2])
>>> np.tile(a, 2)
# 结果:[0, 1, 2, 0, 1, 2]

这里,reps=2 将 a 复制一次并拼接成一个一维数组。

>>> np.tile(a, (2, 2))
>>>> np.tile(a, (2, 2))
# 结果:[[0, 1, 2, 0, 1, 2],
#       [0, 1, 2, 0, 1, 2]]

reps=(2, 2) 表示先在第一个维度(行)上复制一次,再在第二个维度(列)上复制一次,最终得到 2x6 的数组。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

单链表OJ题(3):合并两个有序链表、链表分割、链表的回文结构

目录 一、合并两个有序链表 二、链表分割 三、链表的回文结构 u解题的总体思路: 合并两个有序链表:首先创建新链表的头节点(哨兵位:本质上是占位子),为了减少一些判断情况,简化操作。然后我们…

Qt6 CMake 中引入 Qt Linguist 翻译功能

qt cmake 使用自带翻译工具配置步骤 创建Qt CMake 程序配置项目 CMake 及 代码使用流程最终CMake 如下最终工程链接为:参考 创建Qt CMake 程序 配置项目 CMake 及 代码 在CMake 中添加如下代码, 导入相关的翻译库 find_package(QT NAMES Qt6 Qt5 REQUIRED COMPON…

Android IPC机制(一)多进程模式

1. 什么是进程? 进程是操作系统分配资源(如 CPU、内存等)的基本单位。简单来说,进程是一个正在执行的程序的实例。每个进程都有自己的内存空间、数据栈和其他辅助数据,用于跟踪进程的执行状态。在 Android 中&#xff…

SQL,力扣题目1767,寻找没有被执行的任务对【递归】

一、力扣链接 LeetCode_1767 二、题目描述 表:Tasks ------------------------- | Column Name | Type | ------------------------- | task_id | int | | subtasks_count | int | ------------------------- task_id 具有唯一值的列。 ta…

《JVM第3课》运行时数据区

无痛快速学习入门JVM,欢迎订阅本免费专栏 运行时数据区结构图如下: 可分为 5 个区域,分别是方法区、堆区、虚拟机栈、本地方法栈、程序计数器。这里大概介绍一下各个模块的作用,会在后面的文章展开讲。 类加载子系统会把类信息…

[ 问题解决篇 ] 解决远程桌面安全登录框的问题

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…

Vue+element-ui实现网页右侧快捷导航栏 Vue实现全局右侧快捷菜单功能组件

Vue+element-ui实现网页右侧快捷导航栏 Vue实现全局右侧快捷菜单功能组件 可视区域没超过当前屏幕高度时候只显示三个菜单效果 可视区域超过当前屏幕高度时,显示可回到顶部菜单的,当然这个菜单显示条件可以自定义,根据需求设置 然后将这个整体功能创建为一个全局组件 代…

苏州金龙新V系客车创新引领旅游出行未来

10月25日,为期三天的“2024第六届旅游出行大会”在风景秀丽的云南省丽江市落下帷幕。本次大会由中国旅游车船协会主办,全面展示了中国旅游出行行业最新发展动态和发展成就,为旅游行业带来全新发展动力。 在大会期间,备受瞩目的展车…

看门狗电路原理与应用

看门狗的原理与应用 看门狗基本原理 看门狗,英文简称为“Watchdog Timer ”或者“Watchdog”; 本质上就是一个定时器的作用,简单理解就是 MCU发出一个周期性的信号,这个信号是满足看门狗芯片内部计时器的时间限制,则…

Caché/IRIS file2Xml 一个将文件转换成Studio导出的xml格式的工具

file2Xml 一个将文件转换成Studio导出的xml格式的工具 通过此工具可以将本地文件转换成xml格式文件,然后通过Studio导入到服务器中,而不再需要其他工具将文件传至服务器。 下面以为ensemble2016自带的一个示例界面增加背景图为例。 http://localhos…

java项目之教师工作量管理系统源码(springboot)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的教师工作量管理系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 教师工作量管理系统的…

外贸平台开发多语言处理的三种方式

随着全球贸易的不断增长,外贸平台的多语言处理已成为提升用户体验和市场竞争力的重要因素。在开发外贸平台时,有多种方法可以实现多语言支持。本文将探讨三种主要的多语言处理方式:数据库级多语言支持、前端国际化框架以及内容管理系统&#…

《Python网络安全项目实战》项目2 Python基础练习_总复习(1)

《Python网络安全项目实战》项目2 Python基础练习 总复习(1) 班级: 姓名: 实训成绩: 任务单成绩 : 输入用户名密码并将其输出打印。 userName _____________________ passWord ______________________ #输…

Linux——Ubuntu环境C编程

配置vim编辑器 设置一个tab键为4个空格 打开/etc/vim/vimrc文件,此文件为只读,所以要用sudo访问boot权限: set ts4(设置一个tab键为4空格) set nu(vim编辑器下显示行号) gcc编译器 gcc命令…

Java毕业设计-基于微信小程序的校园二手物品交易系统的实现(V2.0)

博主介绍:✌stormjun、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…

WPF+MVVM案例实战(十九)- 自定义字体图标按钮的封装与实现(EF类)

文章目录 1、案例效果1、按钮分类2、E类按钮功能实现与封装1.文件创建与代码实现2、样式引用与封装 3、F类按钮功能实现与封装1、文件创建与代码实现2、样式引用与封装 3、按钮案例演示1、页面实现与文件创建2、运行效果如下 4、源代码获取 1、案例效果 1、按钮分类 在WPF开发…

各地级市能源消耗量数据-基于灯光数据的反演(2000-2022年)

今天带来的数据是的全国各省市能源消耗量数据,省级的能源消耗量数据可以在统计年鉴之中查到,但市级的数据却暂无统计。但今天我们基于一篇论文提供的思路,通过夜间灯光与省级能源消耗量对更小尺度的地区能源消耗量进行反算。原文提供1995-200…

告别登录,这款插件直接复制CSDN内容,真棒!

前言 我们在开发过程中,肯定会遇到这样或者那样的问题,这时候,我们想到最多的就是用搜索引擎去搜索各种资料,查看各种博客。以前,查看博客是很方便的,不过后来,像CSDN的,就是必须要…

ssm《数据库系统原理》课程平台的设计与实现+vue

系统包含:源码论文 所用技术:SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习,获取源码看文章最下面 需要定制看文章最下面 目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容…

Altium Designer使用技巧(三)

PCB规则 1、间距规则 间距一般>6mil。 2、线宽规则 线宽规则>6mil,一般10mil; 电源线宽>15mil,般20mil; 3、过孔规则。 一般孔与盘的关系,盘是孔的2倍。 比如孔是12mil,盘是24mil。 如果过孔没按规则的话,点右上角设置或DP&…