【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.3 结构化索引:记录数组与字段访问

在这里插入图片描述

2.3 结构化索引:记录数组与字段访问

目录/提纲
结构化索引:记录数组与字段访问
结构化数据类型定义
字段访问优化
内存对齐原理
记录数组操作
CSV 数据转换案例

2.3.1 结构化数据类型定义
2.3.1.1 结构化数据类型的简介
2.3.1.2 使用 dtype 定义结构化数据类型
2.3.2 字段访问优化
2.3.2.1 字段访问的基本方法
2.3.2.2 字段访问的性能优化
2.3.3 内存对齐原理
2.3.3.1 内存对齐的概念
2.3.3.2 内存对齐的实现
2.3.4 记录数组操作
2.3.4.1 创建记录数组
2.3.4.2 记录数组的切片和索引
2.3.5 CSV 数据转换案例
2.3.5.1 读取 CSV 文件
2.3.5.2 将 CSV 数据转换为结构化数组
2.3.5.3 案例分析

结构化数组体系
数据类型定义
字段访问
内存优化
dtype对象
类型限定符
字段索引
记录视图
内存对齐
缓存优化
标量类型
结构化类型

文章内容

NumPy 的结构化数组是处理复杂数据结构的强大工具。结构化数组允许我们为每个元素定义多个字段,从而更好地组织和访问数据。本文将详细介绍结构化数组的定义、字段访问优化、内存对齐原理以及记录数组操作,并通过一个 CSV 数据转换的案例来展示这些功能的应用。

2.3.1 结构化数据类型定义

2.3.1.1 结构化数据类型的简介

结构化数据类型(Structured Data Types)允许我们为每个数组元素定义多个字段,每个字段可以有不同的数据类型。这在处理具有多个属性的数据时非常有用,例如数据库记录、电子表格数据等。

原理说明
  • 字段:每个元素可以有多个字段,每个字段有特定的名称和数据类型。
  • 内存布局:结构化数组的内存布局可以根据字段的定义进行优化,以提高访问效率。
2.3.1.2 使用 dtype 定义结构化数据类型

在 NumPy 中,可以使用 dtype 参数来定义结构化数据类型。dtype 是一个包含字段名称、数据类型和偏移量的字典。

结构化dtype的数学表示:

dtype = { ( n a m e 1 , t y p e 1 , o f f s e t 1 ) , … , ( n a m e n , t y p e n , o f f s e t n ) } \text{dtype} = \{ (name_1, type_1, offset_1), \dots, (name_n, type_n, offset_n) \} dtype={(name1,type1,offset1),,(namen,typen,offsetn)}

示例创建包含3个字段的数据类型:

person_dtype = np.dtype([('name', 'U32'),       # 32字符Unicode('age', 'u1'),         # 无符号字节('salary', 'f4', (3,)) # 3个float32的数组
], align=True)             # 启用内存对齐print(person_dtype.itemsize)  # 输出:64(对齐后的总大小)

内存布局示意图(Mermaid):

0-127
128-131
132-143
144-155
内存起始
name字段
age字段
填充区
salary字段
示例代码
import numpy as np# 定义结构化数据类型
dtype = np.dtype([('name', '<U10'), ('age', 'i4'), ('height', 'f4')])  # 定义三个字段:name(字符串),age(整数),height(浮点数)# 创建结构化数组
structured_array = np.array([('Alice', 25, 1.65), ('Bob', 30, 1.80), ('Charlie', 22, 1.75)], dtype=dtype)
print(structured_array)  # 输出结构化数组

2.3.2 字段访问优化

2.3.2.1 字段访问的基本方法

在结构化数组中,字段访问非常直观。可以通过字段名称直接访问字段数据。

示例代码
# 创建结构化数组
dtype = np.dtype([('name', '<U10'), ('age', 'i4'), ('height', 'f4')])
structured_array = np.array([('Alice', 25, 1.65), ('Bob', 30, 1.80), ('Charlie', 22, 1.75)], dtype=dtype)# 访问字段
names = structured_array['name']
ages = structured_array['age']
heights = structured_array['height']print(names)  # 输出 ['Alice' 'Bob' 'Charlie']
print(ages)  # 输出 [25 30 22]
print(heights)  # 输出 [1.65 1.8  1.75]
2.3.2.2 字段访问的性能优化

字段访问的性能可以通过以下几个方面进行优化:

  • 字段顺序:合理安排字段的顺序可以减少内存访问的开销。
  • 内存对齐:使用内存对齐可以提高读写速度。
  • 避免不必要的字段访问:尽量减少对不需要的字段的访问。
示例代码
# 创建结构化数组
dtype = np.dtype([('name', '<U10'), ('age', 'i4'), ('height', 'f4')])
structured_array = np.array([('Alice', 25, 1.65), ('Bob', 30, 1.80), ('Charlie', 22, 1.75)], dtype=dtype)# 优化字段顺序
dtype_optimized = np.dtype([('age', 'i4'), ('height', 'f4'), ('name', '<U10')])
structured_array_optimized = np.array([(25, 1.65, 'Alice'), (30, 1.80, 'Bob'), (22, 1.75, 'Charlie')], dtype=dotype_optimized)# 访问字段
ages_optimized = structured_array_optimized['age']
heights_optimized = structured_array_optimized['height']print(ages_optimized)  # 输出 [25 30 22]
print(heights_optimized)  # 输出 [1.65 1.8  1.75]

2.3.3 内存对齐原理

2.3.3.1 内存对齐的概念

内存对齐是指数据在内存中的存储位置要满足特定的对齐要求。合理的内存对齐可以提高数据访问的速度,减少缓存缺失。

原理说明
  • 对齐要求:不同数据类型有不同的对齐要求。例如,4字节整数的对齐要求是4字节。
  • 对齐方式:NumPy 会自动对齐字段,但也可以通过设置 align 参数来手动控制对齐。

对齐偏移量计算公式:

o f f s e t i = ⌈ c u r r e n t _ o f f s e t a l i g n m e n t i ⌉ × a l i g n m e n t i offset_i = \lceil \frac{current\_offset}{alignment_i} \rceil \times alignment_i offseti=alignmenticurrent_offset×alignmenti

2.3.3.2 内存对齐的实现

在定义结构化数据类型时,可以使用 align=True 参数来实现内存对齐。

示例代码
# 创建对齐的结构化数据类型
dtype_aligned = np.dtype([('name', '<U10'), ('age', 'i4'), ('height', 'f4')], align=True)
structured_array_aligned = np.array([('Alice', 25, 1.65), ('Bob', 30, 1.80), ('Charlie', 22, 1.75)], dtype=dtype_aligned)# 访问字段
names_aligned = structured_array_aligned['name']
ages_aligned = structured_array_aligned['age']
heights_aligned = structured_array_aligned['height']print(names_aligned)  # 输出 ['Alice' 'Bob' 'Charlie']
print(ages_aligned)  # 输出 [25 30 22]
print(heights_aligned)  # 输出 [1.65 1.8  1.75]

2.3.4 记录数组操作

2.3.4.1 创建记录数组

记录数组(Record Arrays)是结构化数组的一种特殊形式,它允许我们使用点号(.)来访问字段,类似于对象的属性访问。

示例代码
# 创建记录数组
dtype = np.dtype([('name', '<U10'), ('age', 'i4'), ('height', 'f4')])
record_array = np.rec.array([('Alice', 25, 1.65), ('Bob', 30, 1.80), ('Charlie', 22, 1.75)], dtype=dtype)# 访问字段
print(record_array.name)  # 输出 ['Alice' 'Bob' 'Charlie']
print(record_array.age)  # 输出 [25 30 22]
print(record_array.height)  # 输出 [1.65 1.8  1.75]
2.3.4.2 记录数组的切片和索引

记录数组支持切片和索引操作,与普通数组类似。

示例代码
# 创建记录数组
dtype = np.dtype([('name', '<U10'), ('age', 'i4'), ('height', 'f4')])
record_array = np.rec.array([('Alice', 25, 1.65), ('Bob', 30, 1.80), ('Charlie', 22, 1.75)], dtype=dtype)# 切片操作
sub_array = record_array[1:3]
print(sub_array)  # 输出 [('Bob', 30, 1.8) ('Charlie', 22, 1.75)]# 索引操作
print(record_array[0].name)  # 输出 'Alice'
print(record_array[0].age)  # 输出 25
print(record_array[0].height)  # 输出 1.65

2.3.5 CSV 数据转换案例

2.3.5.1 读取 CSV 文件

读取 CSV 文件并将数据转换为 NumPy 结构化数组。

示例代码
import csv# 读取 CSV 文件
def read_csv(filename):with open(filename, 'r') as file:reader = csv.reader(file)header = next(reader)  # 读取表头data = [row for row in reader]  # 读取数据return header, dataheader, data = read_csv('data.csv')
print(header)  # 输出 ['name', 'age', 'height']
print(data)  # 输出 [['Alice', '25', '1.65'], ['Bob', '30', '1.80'], ['Charlie', '22', '1.75']]
2.3.5.2 将 CSV 数据转换为结构化数组

将读取的 CSV 数据转换为 NumPy 结构化数组。

示例代码
# 将 CSV 数据转换为结构化数组
def convert_to_structured_array(header, data):dtype = np.dtype([(field, 'U10' if field == 'name' else 'i4' if field == 'age' else 'f4') for field in header])structured_array = np.array(data, dtype=dtype)return structured_arraystructured_array = convert_to_structured_array(header, data)
print(structured_array)  # 输出结构化数组
2.3.5.3 案例分析

通过上述示例,我们可以看到如何将 CSV 文件中的数据读取并转换为 NumPy 结构化数组。这种做法在处理带有多个属性的数据时非常高效,可以方便地进行字段访问和操作。

完整案例代码
import numpy as np
import csv# 读取 CSV 文件
def read_csv(filename):with open(filename, 'r') as file:reader = csv.reader(file)header = next(reader)  # 读取表头data = [row for row in reader]  # 读取数据return header, data# 将 CSV 数据转换为结构化数组
def convert_to_structured_array(header, data):dtype = np.dtype([(field, 'U10' if field == 'name' else 'i4' if field == 'age' else 'f4') for field in header])structured_array = np.array(data, dtype=dtype)return structured_array# 读取 CSV 文件
header, data = read_csv('data.csv')# 将 CSV 数据转换为结构化数组
structured_array = convert_to_structured_array(header, data)# 访问字段
names = structured_array['name']
ages = structured_array['age']
heights = structured_array['height']print(f"Names: {names}")
print(f"Ages: {ages}")
print(f"Heights: {heights}")# 创建记录数组
record_array = np.rec.array(data, dtype=structured_array.dtype)# 访问记录数组
print(f"Record Array: {record_array}")
print(f"First Name: {record_array[0].name}")
print(f"First Age: {record_array[0].age}")
print(f"First Height: {record_array[0].height}")

总结

通过本文的学习,读者将能够更好地理解 NumPy 结构化数组的定义和使用方法。结构化数组允许我们为每个元素定义多个字段,从而更好地组织和访问复杂数据。字段访问可以通过字段名称进行,支持性能优化和内存对齐。记录数组是结构化数组的一种特殊形式,支持点号操作,使得字段访问更加直观。最后,通过一个 CSV 数据转换的案例,读者可以了解如何将实际数据读取并转换为结构化数组,从而在实际应用中更好地利用这些高级功能。

参考资料

  • NumPy 官方文档
  • NumPy 结构化数组介绍
  • Python 数据科学手册
  • 结构化数据类型定义
  • 字段访问优化
  • 内存对齐原理
  • 记录数组操作
  • CSV 数据处理
  • NumPy 性能测试
  • 高性能 Python 编程
  • NumPy 数据类型详解
  • Python 内存管理
  • NumPy 结构化数组示例
  • NumPy 内存对齐案例
  • [CSV 数据转换技巧](https://www FluentPython.com/numpy-csv-conversion)

希望本文的内容能够帮助读者在实际应用中更好地利用 NumPy 的结构化数组功能,提高数据处理的效率和性能。这篇文章包含了详细的原理介绍、代码示例、源码注释以及案例等。希望这对您有帮助。如果有任何问题请随私信或评论告诉我。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在GPIO控制器中,配置通用输入,读取IO口电平时,上拉和下拉起到什么作用

上下拉电阻作用 在通用输入的时候&#xff0c;也就是在读某个IO的电平的时候 一定要让IO口先保持一个电平状态&#xff0c;这样才能检测到不同电平状态。 如何保持电平状态&#xff1f; 1. 可以通过芯片内部的上下拉电阻&#xff0c;由于是弱上下拉一般不用 2. 硬件外界一个…

Unity学习笔记

1.创建基础物体 层级面板右键 2.创建C#脚本 点击资源浏览器 - 右键 脚本组件需要挂在到一个物体上才能运行 点击立方体 - 添加组件 点击运行 3.安装Shader Graph

【python】python油田数据分析与可视化(源码+数据集)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、测试技术。 【python】python油田数据分析与可视化&#xff08…

129.求根节点到叶节点数字之和(遍历思想)

Problem: 129.求根节点到叶节点数字之和 文章目录 题目描述思路复杂度Code 题目描述 思路 遍历思想(利用二叉树的先序遍历) 直接利用二叉树的先序遍历&#xff0c;将遍历过程中的节点值先利用字符串拼接起来遇到根节点时再转为数字并累加起来&#xff0c;在归的过程中&#xf…

SpringCloud篇 微服务架构

1. 工程架构介绍 1.1 两种工程架构模型的特征 1.1.1 单体架构 上面这张图展示了单体架构&#xff08;Monolithic Architecture&#xff09;的基本组成和工作原理。单体架构是一种传统的软件架构模式&#xff0c;其中所有的功能都被打包在一个单一的、紧密耦合的应用程序中。 …

一、TensorFlow的建模流程

1. 数据准备与预处理&#xff1a; 加载数据&#xff1a;使用内置数据集或自定义数据。 预处理&#xff1a;归一化、调整维度、数据增强。 划分数据集&#xff1a;训练集、验证集、测试集。 转换为Dataset对象&#xff1a;利用tf.data优化数据流水线。 import tensorflow a…

鸟哥Linux私房菜笔记(三)

鸟哥Linux私房菜笔记&#xff08;三&#xff09; 该第三部分和第四部分主要为原书的第十一章&#xff08;正则表达式与文件格式化处理&#xff09;&#xff0c;第十二章学习shell脚本&#xff0c;第十六章&#xff08;进程管理与SElinux初探部分&#xff09;&#xff0c;第十七…

基于springboot+vue的哈利波特书影音互动科普网站

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.12 连续数组:为什么contiguous这么重要?

2.12 连续数组&#xff1a;为什么contiguous这么重要&#xff1f; 目录 #mermaid-svg-wxhozKbHdFIldAkj {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-wxhozKbHdFIldAkj .error-icon{fill:#552222;}#mermaid-svg-…

【网络】3.HTTP(讲解HTTP协议和写HTTP服务)

目录 1 认识URL1.1 URI的格式 2 HTTP协议2.1 请求报文2.2 响应报文 3 模拟HTTP3.1 Socket.hpp3.2 HttpServer.hpp3.2.1 start()3.2.2 ThreadRun()3.2.3 HandlerHttp&#xff08;&#xff09; 总结 1 认识URL 什么是URI&#xff1f; URI 是 Uniform Resource Identifier的缩写&…

力扣第149场双周赛

文章目录 题目总览题目详解找到字符串中合法的相邻数字重新安排会议得到最多空余时间I3440.重新安排会议得到最多空余时间II 第149场双周赛 题目总览 找到字符串中合法的相邻数字 重新安排会议得到最多空余时间I 重新安排会议得到最多空余时间II 变成好标题的最少代价 题目…

HTB:Alert[WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用ffuf对alert.htb域名进行子域名FUZZ 使用go…

96,【4】 buuctf web [BJDCTF2020]EzPHP

进入靶场 查看源代码 GFXEIM3YFZYGQ4A 一看就是编码后的 1nD3x.php 访问 得到源代码 <?php // 高亮显示当前 PHP 文件的源代码&#xff0c;用于调试或展示代码结构 highlight_file(__FILE__); // 关闭所有 PHP 错误报告&#xff0c;防止错误信息泄露可能的安全漏洞 erro…

吴恩达深度学习——有效运作神经网络

内容来自https://www.bilibili.com/video/BV1FT4y1E74V&#xff0c;仅为本人学习所用。 文章目录 训练集、验证集、测试集偏差、方差正则化正则化参数为什么正则化可以减少过拟合Dropout正则化Inverted Dropout其他的正则化方法数据增广Early stopping 归一化梯度消失与梯度爆…

【xdoj-离散线上练习】T251(C++)

解题反思&#xff1a; 开始敲代码前想清楚整个思路比什么都重要嘤嘤嘤&#xff01;看到输入m, n和矩阵&#xff0c;注意不能想当然地认为就是高m&#xff0c;宽n的矩阵&#xff0c;细看含义 比如本题给出了树的邻接矩阵&#xff0c;就是n*n的&#xff0c;代码实现中没有用到m这…

deep seek R1本地化部署及openAI API调用

先说几句题外话。 最近deep seek火遍全球&#xff0c;所以春节假期期间趁着官网优惠充值了deep seek的API&#xff0c;用openAI的接口方式尝试了下对deep seek的调用&#xff0c;并且做了个简单测试&#xff0c;测试内容确实非常简单&#xff1a;通过prompt提示词让大模型对用…

01.双Android容器解决方案

目录 写在前面 一&#xff0c;容器 1.1 容器的原理 1.1.1 Namespace 1.1.2 Cgroups&#xff08;Control Groups&#xff09; 1.1.3 联合文件系统&#xff08;Union File System&#xff09; 1.2 容器的应用 1.2.1 微服务架构 1.2.2 持续集成和持续部署&#xff08;CI/…

Python 绘图工具详解:使用 Matplotlib、Seaborn 和 Pyecharts 绘制散点图

目录 数据可视化1.使用 matplotlib 库matplotlib 库 2 .使用 seaborn 库seaborn 库 3 .使用 pyecharts库pyecharts库 注意1. 确保安装了所有必要的库2. 检查Jupyter Notebook的版本3. 使用render()方法保存为HTML文件4. 使用IFrame在Notebook中显示HTML文件5. 检查是否有其他输…

无人机集群新年祝福表演技术原理详解

无人机集群新年祝福表演技术是一项集飞行控制技术、智能协调和精密控制于一体的高科技表演形式。其技术原理主要涉及无人机硬件设备、软件系统以及表演协调等多个方面。以下是对该技术原理的详细解析&#xff1a; 一、无人机硬件设备 无人机集群表演的核心是无人机本身&#x…

贪吃蛇实现

1.资料来源 https://learn.microsoft.com/zh-cn/windows/console/getstdhandle 2.前言 简介 贪吃蛇是久负盛名的游戏&#xff0c;和俄罗斯方块、扫雷等游戏位列于经典游戏的行列。 《贪食蛇》中玩家控制一条不断移动的蛇&#xff0c;在屏幕上吃掉出现的食物。每吃掉一个食物…