numpy的数组深度叠加dstack详解

news2025/5/21 23:05:54
☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython

一、引言

numpy的dstack函数用于沿着第三个维度(深度)将数组堆叠起来。它将多个数组按照深度方向进行堆叠,生成一个新的数组。具体来说,dstack函数会将输入的多个数组在第三个维度上进行拼接,即将每个数组的对应位置的元素组合成一个新的元素。

在这里插入图片描述

初学者在学习使用这个函数时,可能会有一些疑惑?所谓第三个维度是什么呢?假设对于一个数组a[n0,…,nx],当x大于等于2时,可以理解第三个维度为n2对应的维度,那怎么对x=1的二维数组也能堆叠呢?

二、数组的dstack堆叠测试

为了弄懂这个问题,老猿写了个测试程序,分别对一维、二维、三维、四维数组使用dstack进行测试,测试代码如下:

import numpy as np

a1 = np.array(range(36))
a2 = a1.reshape((9,4))
a3 = a1.reshape((3,3,4))
a4 = a1.reshape((3,3,2,2))

l1 = np.array([a1,a2,a3,a4])
l2 = l1+100

index = 0
for a,b in zip(l1,l2):
    c = np.dstack((a,b))
    print(f"\n****a{index}.shape={a.shape},a{index}:\n",a)
    print(f"\n****c{index}.shape={c.shape},c{index}:\n",c)
    index+=1

这个程序先创建一个 36个元素的一维数组,其值为0-35,然后用其为基础创建了2、3、4维的数组,将这些数组作为元素保存到一个l1的数组中好方便处理,然后将l1中每个数组的元素值加100保存到数组l2中,由于l1的所有数组最终维度的元素值为0-36,而l2的为100-136,这样就能方便识别最终输出数组的元素是来着那个数组。

程序输出如下:

****a0.shape=(36,),a0:
 [ 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]

****c0.shape=(1, 36, 2),c0:
 [[[  0 100]
  [  1 101]
  [  2 102]
  [  3 103]
  [  4 104]
  [  5 105]
  [  6 106]
  [  7 107]
  [  8 108]
  [  9 109]
  [ 10 110]
  [ 11 111]
  [ 12 112]
  [ 13 113]
  [ 14 114]
  [ 15 115]
  [ 16 116]
  [ 17 117]
  [ 18 118]
  [ 19 119]
  [ 20 120]
  [ 21 121]
  [ 22 122]
  [ 23 123]
  [ 24 124]
  [ 25 125]
  [ 26 126]
  [ 27 127]
  [ 28 128]
  [ 29 129]
  [ 30 130]
  [ 31 131]
  [ 32 132]
  [ 33 133]
  [ 34 134]
  [ 35 135]]]

****a1.shape=(9, 4),a1:
 [[ 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]]

****c1.shape=(9, 4, 2),c1:
 [[[  0 100]
  [  1 101]
  [  2 102]
  [  3 103]]

 [[  4 104]
  [  5 105]
  [  6 106]
  [  7 107]]

 [[  8 108]
  [  9 109]
  [ 10 110]
  [ 11 111]]

 [[ 12 112]
  [ 13 113]
  [ 14 114]
  [ 15 115]]

 [[ 16 116]
  [ 17 117]
  [ 18 118]
  [ 19 119]]

 [[ 20 120]
  [ 21 121]
  [ 22 122]
  [ 23 123]]

 [[ 24 124]
  [ 25 125]
  [ 26 126]
  [ 27 127]]

 [[ 28 128]
  [ 29 129]
  [ 30 130]
  [ 31 131]]

 [[ 32 132]
  [ 33 133]
  [ 34 134]
  [ 35 135]]]

****a2.shape=(3, 3, 4),a2:
 [[[ 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]]]

****c2.shape=(3, 3, 8),c2:
 [[[  0   1   2   3 100 101 102 103]
  [  4   5   6   7 104 105 106 107]
  [  8   9  10  11 108 109 110 111]]

 [[ 12  13  14  15 112 113 114 115]
  [ 16  17  18  19 116 117 118 119]
  [ 20  21  22  23 120 121 122 123]]

 [[ 24  25  26  27 124 125 126 127]
  [ 28  29  30  31 128 129 130 131]
  [ 32  33  34  35 132 133 134 135]]]

****a3.shape=(3, 3, 2, 2),a3:
 [[[[ 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]]]]

****c3.shape=(3, 3, 4, 2),c3:
 [[[[  0   1]
   [  2   3]
   [100 101]
   [102 103]]

  [[  4   5]
   [  6   7]
   [104 105]
   [106 107]]

  [[  8   9]
   [ 10  11]
   [108 109]
   [110 111]]]


 [[[ 12  13]
   [ 14  15]
   [112 113]
   [114 115]]

  [[ 16  17]
   [ 18  19]
   [116 117]
   [118 119]]

  [[ 20  21]
   [ 22  23]
   [120 121]
   [122 123]]]


 [[[ 24  25]
   [ 26  27]
   [124 125]
   [126 127]]

  [[ 28  29]
   [ 30  31]
   [128 129]
   [130 131]]

  [[ 32  33]
   [ 34  35]
   [132 133]
   [134 135]]]]

三、结论

从上面的程序和输出来看,dstack在进行数组堆叠时有如下结论:

  1. 不但能堆叠三维以上数组,而且能堆叠一维和二维数组;
  2. 对三维以上数组堆叠时,结果数组的维度数保持不变;三维以上数组堆叠时,取两个参与堆叠数组的第三个维度的元素进行堆叠(元素合并)处理,堆叠后第三个维度的元素为参与堆叠的两个数组第三个维度的合并,因此个数翻倍,其他维度保持不变;
  3. 对二维数组堆叠时,堆叠结果为三维数组,前面两个维度大小就是参与堆叠的两个数组的维度大小,最后一个维度大小固定为2; 二维数组堆叠时,堆叠结果的第三个维度的元素为参与堆叠的两个数组第二个维度的元素按顺序逐一各取一个构成数组作为结果数组第三个维度对应位置的元素;
  4. 对一维数组堆叠时,堆叠结果为三维数组,第一个维度大小就是参与堆叠的两个数组的维度大小,第二个维度的大小固定为1,最后一个维度大小固定为2;一维数组堆叠时,堆叠结果的第三个维度的元素为参与堆叠的两个数组的元素按顺序逐一各取一个构成数组作为结果数组第三个维度对应位置的元素。

如果诸君对以上描述存在疑问,请结合上面的案例进行对比验证。

如对文章内容存在疑问或需要相关资料,可在博客评论区留言,或关注:老猿Python 微信公号发消息咨询,可通过扫二维码加微信公众号。

写博不易,敬请支持

如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!

关于老猿的付费专栏

  1. 付费专栏《https://blog.csdn.net/laoyuanpython/category_9607725.html 使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,对应文章目录为《 https://blog.csdn.net/LaoYuanPython/article/details/107580932 使用PyQt开发图形界面Python应用专栏目录》;
  2. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10232926.html moviepy音视频开发专栏 )详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/107574583 moviepy音视频开发专栏文章目录》;
  3. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》为《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的伴生专栏,是笔者对OpenCV-Python图形图像处理学习中遇到的一些问题个人感悟的整合,相关资料基本上都是老猿反复研究的成果,有助于OpenCV-Python初学者比较深入地理解OpenCV,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/109713407 OpenCV-Python初学者疑难问题集专栏目录 》
  4. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10762553.html Python爬虫入门 》站在一个互联网前端开发小白的角度介绍爬虫开发应知应会内容,包括爬虫入门的基础知识,以及爬取CSDN文章信息、博主信息、给文章点赞、评论等实战内容。

前两个专栏都适合有一定Python基础但无相关知识的小白读者学习,第三个专栏请大家结合《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的学习使用。

对于缺乏Python基础的同仁,可以通过老猿的免费专栏《https://blog.csdn.net/laoyuanpython/category_9831699.html 专栏:Python基础教程目录)从零开始学习Python。

如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。

老猿Python,跟老猿学Python!

☞ ░ 前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython ░

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

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

相关文章

【网络原理】HTTP协议和使用Fiddler抓包

文章目录 🍃HTTP协议是什么?🍀理解 "应用层协议"🎍HTTP 协议的工作过程🌴HTTP 协议格式🌳Fiddler抓包工具的使用🌸如何抓HTTPS的包? 🎋抓包工具的原理&#x1…

直观与交互:山海鲸可视化软件与Excel传统表格的对比

作为一名长期使用Excel进行数据处理和分析的用户,最近我尝试了一款名为山海鲸的可视化软件,发现它与Excel传统表格之间存在诸多明显的差异。接下来,我将从个人体验视角出发,谈谈这两种工具的不同之处。 首先,从数据呈…

HashMap设置初始容量为17,那么它的实际容量是多少?

典型回答 即使初始化 HashMap 的容量为 17,那么它的实际容量却是 32。 这是因为 HashMap 的容量只能为 2 的 N次方,这是 HashMap 的源代码中的实现,无论用户输入的是多少,它总会通过计算,得到第一个比他大的2的N 次方…

cc-uploadSomePic图片上传组件:快速开发与用户体验的提升

cc-uploadSomePic图片上传组件:快速开发与用户体验的提升 摘要: 在前端开发中,图片上传功能是一个常见的需求。为了提高开发效率和用户体验,我们开发了一个名为cc-uploadSomePic的图片上传组件。该组件支持单个或多个文件上传&am…

Linux下使用ntpdate进行时间同步

1.简介 ntpdate是Linux下用于从NTP服务器同步时间的命令行工具。 2.安装 大多数Linux发行版已预装ntpdate。未安装的可使用以下命令: # Ubuntu/Debian sudo apt-get install ntpdate # CentOS/Fedora/RHEL sudo yum install ntpdate 3.手工同步网络时间 执行以下命…

JavaScript中的继承方式详细解析

什么是继承 继承是面向对象编程中的一个重要概念,它指的是一个对象(或类)可以获得另一个对象(或类)的属性和方法。在继承中,被继承的对象通常称为父类(或基类、超类),继…

prince2和Pmp哪个含金量高?

一,认证情况 1、PMP(项目管理专业人士资格认证)是PMI( 美国项目管理协会 )最有影响力的证书,PMBOK( 项目管理知识体系指南 )是PMP的认证标准,是美国国家项目管理标准,PMI会员有70%集中在北美,PMP认证在北美地区很受欢…

基础乱炖来吧

1,SSH框架和SSM区别 SSH:structspringhibernate,SSM:MVCspringmybatis struct入口是filter级别,对action类进行请求,一个action类对应一个请求、类拦截;spring-mvcservlet级别,方法级别请求&…

【ESP32 IDF】ESPTIMER定时器

文章目录 前言一、ESPTIMER定时器的介绍1.1 定时器是什么1.2 ESPTIMER定时器的介绍 二、ESPTIMER的使用2.1 简单使用过程2.2 停止定时器2.3 删除定时器 三、示例代码总结 前言 在ESP32 IDF开发框架中,ESPTIMER是一个功能强大的定时器模块,用于实现定时任…

武汉星起航引领跨境电商风潮,五对一服务体系助力卖家飞跃成长

在全球贸易蓬勃发展的背景下,跨境电商行业迎来了前所未有的机遇与挑战。在这一领域中,武汉星起航电子商务有限公司以其专业的运营团队和优质的服务,成为众多跨境卖家的首选合作伙伴。 武汉星起航自2020年创立以来,始终致力于为跨…

前端项目ip做域名映射

1、在阿里云、腾讯云购买域名 SSL 证书和私钥生成 阿里云生成证书详解 /path/to/your/ssl_certificate1.crt和/path/to/your/ssl_certificate1.key 生成私钥(key): 使用 OpenSSL 工具生成一个私钥文件。执行以下命令: openss…

基于python高校选课系统设计与实现flask-django-nodejs-php

随着互联网技术的不断发展,高校选课系统的建设和应用已成为当前高校教育改革的重要方向。选课系统作为高校教务管理的重要组成部分,对于提高教学质量、提高学生的学习效率、优化教学资源配置具有重要的意义。本论文旨在探讨高校选课系统的设计与实现。随…

StringTable(字符串常量池)

目录 String的基本特性 String的内存分配 字符串拼接操作 intern()的使用 String的基本特性 String:字符串,使用一对""引起来表示 String声明为final的,不可被继承 String实现了Serializable接口:表示字符串是支持…

TIMESNET: TEMPORAL 2D-VARIATION MODELINGFOR GENERAL TIME SERIES ANALYSIS

本文整理至https://zhuanlan.zhihu.com/p/606575441这里是清华大学软件学院机器学习组官方公众号(THUML-LAB),欢迎关注我们,获取最新资讯! 本文介绍本组ICLR2023时间序列分析方向的最新工作:TimesNet: Temporal 2D-Variation Mode…

Python 实现1~100之间的偶数求和

result0 for i in range(101):if i%20:result result i print(result) 或者 result0 for i in range(2,101,2):result result i print(result)

从零开始学习如何使用 Postman 请求头

当你在使用 Postman 发送请求时,请求头(Headers)是你可以包含在 HTTP 请求中的重要部分之一。请求头包含了关于请求的元数据信息,这些信息对于服务器来处理请求是非常重要的。下面是一份详细的图文介绍,说明了如何在 P…

BUUCTF-Misc10

秘密文件1 1.打开附件 是一个流量包 2.Wireshark 用Wireshark打开 右键追踪tcp追踪流,发现一个以.rar结尾的压缩包 3.foremost 用foremost分离文件 发现有一个rar的文件夹 文件夹内有个加密的压缩包 4.ARCHPR 用ARCHPR工具对压缩包进行解密 5.得到flag [BJDCTF2…

【C语言进阶篇】自定义类型:结构体(上)

目录 1. 结构体类型的声明 ​编辑 1.1 结构体的创建和初始化 1.2 结构体的特殊声明 1.3 结构体的自引用 2. 结构体内存对齐 2.1 对齐规则 2.2 为什么存在内存对齐 2.3 修改默认对齐数 在我们描述简单对象的时候,使用已有的类型就足够了,比如: 但是当我们…

数据结构从入门到精通——排序的概念及运用

排序的概念及运用 前言一、排序的概念排序稳定性内部排序外部排序 二、排序运用三、常见的排序算法四、排序性能检测代码srand()clock() 五、oj排序测试代码 前言 排序是将数据按照一定规则重新排列的过程,常见规则有升序、降序等。排序算法如冒泡排序、快速排序等…