杨桃的Python进阶讲座17——数组array(七)三维数组和n维数组的索引和取值(配详细图解)

本文主要是介绍杨桃的Python进阶讲座17——数组array(七)三维数组和n维数组的索引和取值(配详细图解),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本人CSDN博客专栏:https://blog.csdn.net/yty_7

Github地址:https://github.com/yot777/

 

三维数组的索引和取值

创建一个numpy三维数组z,如下所示:

>>> import numpy as np
>>> z=np.array([[[1,2,3,4],[5,6,7,8]],[[9,10,11,12],[13,14,15,16]]])
>>> print(z)
[[[ 1  2  3  4][ 5  6  7  8]][[ 9 10 11 12][13 14 15 16]]]

三维数组没有了矩阵的行、列概念,但我们可以用shape()函数查看它的维度信息:

>>> np.shape(z)
(2, 2, 4)

三维数组z的维度是(2, 2, 4),是不是挺难理解的呢!

其实把(2, 2, 4)变型为(2, (2, 4)),即2个(2, 4)矩阵,就成了三维数组啦!

图示如下,可理解为三维数组z是由2(2, 4)的矩阵平面构成的

我们继续使用二维数组的索引方式来查看三维数组,如下:

如果[ ]以数字或者单冒号开头,表示取矩阵平面的全部元素,举例:

>>> z[0]             #取第0个矩阵平面的元素
array([[1, 2, 3, 4],[5, 6, 7, 8]])
>>> z[1]             #取第1个矩阵平面的元素
array([[ 9, 10, 11, 12],[13, 14, 15, 16]])
>>> z[:1]            #取从0开始到1-1=0个矩阵平面的元素
array([[[1, 2, 3, 4],[5, 6, 7, 8]]])

图示:

如果[ ]以冒号逗号(即:,)开头,表示取矩阵平面行元素,举例:

>>> z[:,0]       #取所有矩阵平面的第0行
array([[ 1,  2,  3,  4],[ 9, 10, 11, 12]])
>>> z[:,1]       #取所有矩阵平面的第1行
array([[ 5,  6,  7,  8],[13, 14, 15, 16]])

图示:

取指定某个矩阵平面某一行,使用[矩阵平面号][行号]来表示

取指定某个矩阵平面某一列,使用[矩阵平面号][:, 列号]来表示

举例:

>>> z[0][1]          #取第0个矩阵平面的第1行
array([5, 6, 7, 8])
>>> z[1][0]          #取第1个矩阵平面的第0行
array([ 9, 10, 11, 12])
>>> z[0][:,2]        #取第0个矩阵平面的第2列
array([3, 7])   
>>> z[1][:,3]        #取第1个矩阵平面的第3列
array([12, 16])

图示:

如果[ ]以两个冒号逗号(即:,:,)开头,表示取矩阵平面列元素,举例:

>>> z[:,:,0]         #取所有矩阵平面的第0列
array([[ 1,  5],[ 9, 13]])
>>> z[:,:,2]         #取所有矩阵平面的第2列
array([[ 3,  7],[11, 15]])

图示:

取三维数组的某个具体元素,使用[矩阵平面号][行号][列号]的方式来表示,举例:

>>> z[0][1][2]     #取第0个矩阵平面第1行第2列的数据
7
>>> z[1][1][1]     #取第1个矩阵平面第1行第1列的数据
14

图示:

n维数组的索引和取值

对于超过三维的n维数组,很难用直观的方法画出图形,但我们仍然可以仿照三维数组的原则进行索引和取值

n维数组的形状可以表示为:

最右侧 x1为一维(最终存放元素的地方),x2一维元素的个数x3二维元素的个数……最左侧的xn为n-1维元素的个数。

举例:

(6,2,7,3,4)是一个五维数组s,一维有4个元素,二维有3个一维元素的个数,三维有7个二维元素的个数,四维有2个三维元素的个数,五维有6个四维元素的个数,总元素个数是4*3*7*2*6=1008个

那么s[a]只有一对中括号的时候,总共6个元素,取值从s[0]到s[5])

s[a][b]有两对中括号的时候,总共6*2=12个元素,取值从s[0][0]到s[0][1],再从s[1][0]到s[1][1]……直到从s[5][0]到s[5][1]

s[a][b][c]有三对中括号的时候,总共6*2*7=84个元素,取值从s[0][0][0]到s[0][0][6],再从s[0][1][0]到s[0][1][6],

再从s[1][0][0]到s[5][1][6]

……

因此,可以采取多重循环的方式对五维数组s的元素进行遍历,从最内层到最外层:

第一层循环:从s[0][0][0][0][0]到s[0][0][0][0][3]    (4次循环)

第二层循环:从s[0][0][0][0][0]到s[0][0][0][2][3]     (3次循环)

第三层循环:从s[0][0][0][0][0]到s[0][0][6][2][3]     (7次循环)

第四层循环:从s[0][0][0][0][0]到s[0][1][6][2][3]     (2次循环)

第五层循环:从s[0][0][0][0][0]到s[5][1][6][2][3]     (6次循环)

遍历时,每一层循环都必须进行相应次数的下一层循环才行,因此总共进行6*2*7*3*4=1008次循环。

 

总结

三维数组是由二维矩阵平面构成的

如果[ ]以数字或者单冒号开头,表示取矩阵平面的全部元素

如果[ ]以冒号逗号(即:,)开头,表示取矩阵平面行元素

取指定某个矩阵平面某一行,使用[矩阵平面号][行号]来表示

取指定某个矩阵平面某一列,使用[矩阵平面号][:, 列号]来表示

如果[ ]以两个冒号逗号(即:,:,)开头,表示取矩阵平面列元素

取三维数组的某个具体元素,使用[矩阵平面号][行号][列号]的方式来表示

n维数组的形状可以表示为:

最右侧 x1为一维(最终存放元素的地方),x2一维元素的个数x3二维元素的个数……最左侧的xn为n-1维元素的个数。

遍历n维数组时,每一层循环都必须进行相应次数的下一层循环才行,因此总共进行xn*xn-1*……*x3*x2*x1次循环。

 

本人CSDN博客专栏:https://blog.csdn.net/yty_7

Github地址:https://github.com/yot777/

如果您觉得本篇本章对您有所帮助,欢迎关注、评论、点赞!Github欢迎您的Follow、Star!

这篇关于杨桃的Python进阶讲座17——数组array(七)三维数组和n维数组的索引和取值(配详细图解)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/334027

相关文章

Python FastMCP构建MCP服务端与客户端的详细步骤

《PythonFastMCP构建MCP服务端与客户端的详细步骤》MCP(Multi-ClientProtocol)是一种用于构建可扩展服务的通信协议框架,本文将使用FastMCP搭建一个支持St... 目录简介环境准备服务端实现(server.py)客户端实现(client.py)运行效果扩展方向常见问题结

Spring Boot 整合 Apache Flink 的详细过程

《SpringBoot整合ApacheFlink的详细过程》ApacheFlink是一个高性能的分布式流处理框架,而SpringBoot提供了快速构建企业级应用的能力,下面给大家介绍Spri... 目录Spring Boot 整合 Apache Flink 教程一、背景与目标二、环境准备三、创建项目 & 添

详解如何使用Python构建从数据到文档的自动化工作流

《详解如何使用Python构建从数据到文档的自动化工作流》这篇文章将通过真实工作场景拆解,为大家展示如何用Python构建自动化工作流,让工具代替人力完成这些数字苦力活,感兴趣的小伙伴可以跟随小编一起... 目录一、Excel处理:从数据搬运工到智能分析师二、PDF处理:文档工厂的智能生产线三、邮件自动化:

Java进程CPU使用率过高排查步骤详细讲解

《Java进程CPU使用率过高排查步骤详细讲解》:本文主要介绍Java进程CPU使用率过高排查的相关资料,针对Java进程CPU使用率高的问题,我们可以遵循以下步骤进行排查和优化,文中通过代码介绍... 目录前言一、初步定位问题1.1 确认进程状态1.2 确定Java进程ID1.3 快速生成线程堆栈二、分析

Python实现自动化Word文档样式复制与内容生成

《Python实现自动化Word文档样式复制与内容生成》在办公自动化领域,高效处理Word文档的样式和内容复制是一个常见需求,本文将展示如何利用Python的python-docx库实现... 目录一、为什么需要自动化 Word 文档处理二、核心功能实现:样式与表格的深度复制1. 表格复制(含样式与内容)2

Java中的登录技术保姆级详细教程

《Java中的登录技术保姆级详细教程》:本文主要介绍Java中登录技术保姆级详细教程的相关资料,在Java中我们可以使用各种技术和框架来实现这些功能,文中通过代码介绍的非常详细,需要的朋友可以参考... 目录1.登录思路2.登录标记1.会话技术2.会话跟踪1.Cookie技术2.Session技术3.令牌技

python获取cmd环境变量值的实现代码

《python获取cmd环境变量值的实现代码》:本文主要介绍在Python中获取命令行(cmd)环境变量的值,可以使用标准库中的os模块,需要的朋友可以参考下... 前言全局说明在执行py过程中,总要使用到系统环境变量一、说明1.1 环境:Windows 11 家庭版 24H2 26100.4061

Python中文件读取操作漏洞深度解析与防护指南

《Python中文件读取操作漏洞深度解析与防护指南》在Web应用开发中,文件操作是最基础也最危险的功能之一,这篇文章将全面剖析Python环境中常见的文件读取漏洞类型,成因及防护方案,感兴趣的小伙伴可... 目录引言一、静态资源处理中的路径穿越漏洞1.1 典型漏洞场景1.2 os.path.join()的陷

Python数据分析与可视化的全面指南(从数据清洗到图表呈现)

《Python数据分析与可视化的全面指南(从数据清洗到图表呈现)》Python是数据分析与可视化领域中最受欢迎的编程语言之一,凭借其丰富的库和工具,Python能够帮助我们快速处理、分析数据并生成高质... 目录一、数据采集与初步探索二、数据清洗的七种武器1. 缺失值处理策略2. 异常值检测与修正3. 数据

Python中bisect_left 函数实现高效插入与有序列表管理

《Python中bisect_left函数实现高效插入与有序列表管理》Python的bisect_left函数通过二分查找高效定位有序列表插入位置,与bisect_right的区别在于处理重复元素时... 目录一、bisect_left 基本介绍1.1 函数定义1.2 核心功能二、bisect_left 与