结构化数据:NumPy 的结构化数组

文章目录

  • 结构化数据:NumPy 的结构化数组
    • 探索结构化数组的创建
    • 更高级的复合类型
    • 记录数组:结构化数组的变体
    • 走向 Pandas

结构化数据:NumPy 的结构化数组

结构化数组

虽然我们的数据通常可以用同质数组很好地表示,但有时情况并非如此。本文将演示 NumPy 的结构化数组记录数组的用法,它们为复合的、异构的数据提供了高效的存储方式。虽然这里展示的模式适用于简单操作,但此类场景通常更适合使用 Pandas 的 DataFrame

import numpy as np

假设我们有几类关于多个人的数据(比如姓名、年龄和体重),并且我们希望将这些值存储起来以便在 Python 程序中使用。
我们可以将它们分别存储在三个独立的数组中:

name = ['Alice', 'Bob', 'Cathy', 'Doug']
age = [25, 45, 37, 19]
weight = [55.0, 85.5, 68.0, 61.5]

但是这样做有些笨拙,实际使用起来并不方便,因为这里没有任何内容能表明这三个数组是相关联的;NumPy 的结构化数组允许我们通过使用单一结构来更自然地存储所有这些数据。

回想一下,之前我们使用如下表达式创建了一个简单的数组:

x = np.zeros(4, dtype=int)

我们同样可以使用复合数据类型规范来创建结构化数组:

# 使用复合数据类型创建结构化数组
data = np.zeros(4, dtype={'names':('name', 'age', 'weight'),'formats':('U10', 'i4', 'f8')})
print(data.dtype)
[('name', '<U10'), ('age', '<i4'), ('weight', '<f8')]

这里的 'U10' 表示“最大长度为 10 的 Unicode 字符串”,'i4' 表示“4 字节(即 32 位)整数”,而 'f8' 表示“8 字节(即 64 位)浮点数”。
我们将在下一节讨论这些类型代码的其他选项。

现在我们已经创建了一个空的容器数组,可以用我们的值列表来填充这个数组了:

data['name'] = name
data['age'] = age
data['weight'] = weight
print(data)
[('Alice', 25, 55. ) ('Bob', 45, 85.5) ('Cathy', 37, 68. )('Doug', 19, 61.5)]

如我们所愿,数据现在已经方便地排列在一个结构化数组中。

结构化数组的一个便利之处在于,我们现在既可以通过索引,也可以通过字段名来引用数值:

# 获取所有姓名
data['name']
array(['Alice', 'Bob', 'Cathy', 'Doug'], dtype='<U10')
# 获取第一行数据
data[0]
np.void(('Alice', 25, 55.0), dtype=[('name', '<U10'), ('age', '<i4'), ('weight', '<f8')])
# 获取最后一行的姓名
data[-1]['name']
np.str_('Doug')

通过布尔掩码,我们甚至可以进行更复杂的操作,比如根据年龄进行筛选:

# 获取小于30岁人员的姓名
data[data['age'] < 30]['name']
array(['Alice', 'Doug'], dtype='<U10')

如果你想进行比这些更复杂的操作,建议你考虑使用 Pandas 包。
正如你将看到的,Pandas 提供了一个 DataFrame 对象,这是一种基于 NumPy 数组构建的数据结构,提供了多种有用的数据操作功能,类似于你在这里看到的内容,而且功能远不止这些。

探索结构化数组的创建

结构化数组的数据类型可以通过多种方式指定。
前面我们已经看到了字典的方法:

np.dtype({'names':('name', 'age', 'weight'),'formats':('U10', 'i4', 'f8')})
dtype([('name', '<U10'), ('age', '<i4'), ('weight', '<f8')])

为清晰起见,数值类型也可以使用 Python 类型或 NumPy 的 dtype 来指定:

np.dtype({'names':('name', 'age', 'weight'),'formats':((np.str_, 10), int, np.float32)})
dtype([('name', '<U10'), ('age', '<i8'), ('weight', '<f4')])

复合类型也可以用元组列表的形式指定:

np.dtype([('name', 'S10'), ('age', 'i4'), ('weight', 'f8')])
dtype([('name', 'S10'), ('age', '<i4'), ('weight', '<f8')])

如果你不关心类型的名称,也可以仅用逗号分隔的字符串来指定类型:

np.dtype('S10,i4,f8')
dtype([('f0', 'S10'), ('f1', '<i4'), ('f2', '<f8')])

缩写的字符串格式代码可能一开始不太直观,但它们基于简单的原则。
第一个(可选)字符 <>,分别表示“小端序”或“大端序”,用于指定有效位的排序方式。
下一个字符指定数据的类型:字符、字节、整数、浮点数等(见下表)。
最后一个或多个字符表示对象的字节大小。

字符描述示例
'b'字节np.dtype('b')
'i'有符号整数np.dtype('i4') == np.int32
'u'无符号整数np.dtype('u1') == np.uint8
'f'浮点数np.dtype('f8') == np.int64
'c'复数浮点数np.dtype('c16') == np.complex128
'S', 'a'字符串np.dtype('S5')
'U'Unicode 字符串np.dtype('U') == np.str_
'V'原始数据(void)np.dtype('V') == np.void

更高级的复合类型

可以定义更高级的复合类型。例如,你可以创建一种类型,其中每个元素包含一个数组或矩阵的值。
下面,我们将创建一个数据类型,其中包含一个 mat 字段,该字段是一个 3 × 3 3\times 3 3×3 的浮点型矩阵:

tp = np.dtype([('id', 'i8'), ('mat', 'f8', (3, 3))])
X = np.zeros(1, dtype=tp)
print(X[0])
print(X['mat'][0])
(0, [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]])
[[0. 0. 0.][0. 0. 0.][0. 0. 0.]]

现在,X 数组中的每个元素都包含一个 id 和一个 3 × 3 3\times 3 3×3 的矩阵。
为什么要使用这种方式,而不是简单的多维数组,或者 Python 字典呢?
其中一个原因是,这种 NumPy 的 dtype 可以直接映射到 C 语言的结构体定义,因此包含数组内容的缓冲区可以被适当编写的 C 程序直接访问。
如果你需要为操作结构化数据的遗留 C 或 Fortran 库编写 Python 接口,结构化数组可以提供强大的接口能力。

记录数组:结构化数组的变体

NumPy 还提供了记录数组(np.recarray 类的实例),它们与前面介绍的结构化数组几乎完全相同,但有一个额外的特性:字段可以作为属性访问,而不仅仅是作为字典键访问。
回想一下,我们之前通过如下方式访问示例数据集中的年龄字段:

data['age']
array([25, 45, 37, 19], dtype=int32)

如果我们将数据视为记录数组(record array),就可以用更简洁的方式访问字段:

data_rec = data.view(np.recarray)
data_rec.age
array([25, 45, 37, 19], dtype=int32)

缺点是,对于记录数组,即使使用相同的语法,访问字段时也会有一些额外的开销:

%timeit data['age']
%timeit data_rec['age']
%timeit data_rec.age
34 ns ± 0.458 ns per loop (mean ± std. dev. of 7 runs, 10,000,000 loops each)
481 ns ± 12.6 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
975 ns ± 12.8 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)

这种更方便的记法是否值得(略微的)额外开销,将取决于你的具体应用场景。

走向 Pandas

本文关于结构化数组和记录数组的内容之所以安排在本部分的结尾,是因为它很好地引出了我们接下来要介绍的包:Pandas。
结构化数组在某些场景下非常有用,比如你需要用 NumPy 数组映射到 C、Fortran 或其他语言中的二进制数据格式时。
但在日常的结构化数据处理中,Pandas 包无疑是更好的选择;在接下来的章节中,我们将深入探讨它。

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

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

相关文章

phpcms 更换新域名更新栏目url和内容页url无法更新解决方法

更换域名后更新栏目url和内容页url还是无法更新为新的域名&#xff0c;手动把cache文件夹下能清除的缓存文件清除了还是不行&#xff0c;把数据库的缓存表内容清空了还是不行&#xff0c;问题在于栏目缓存并没有清除。 解决办法: (1)、找到文件&#xff1a;/caches/configs/sys…

玛哈特七辊矫平机:板材平整的精密卫士

在金属板材加工领域&#xff0c;表面平整度是衡量产品质量的核心指标之一。无论是汽车覆盖件、精密仪器外壳&#xff0c;还是建筑装饰板材&#xff0c;任何弯曲、波浪或翘曲都将严重影响后续加工精度、产品强度及美观度。七辊矫平机&#xff0c;凭借其独特的辊系结构设计&#…

融合聚类与分类的退役锂电智能分选技术:助力新能源汽车产业可持续发展

融合聚类与分类的退役锂电智能分选技术&#xff1a;助力新能源汽车产业可持续发展 关键词&#xff1a;退役锂离子电池分选 | 聚类分类融合 | 电化学阻抗谱(EIS) | 动态时间规整(DTW) | 多模态分类模型 新能源汽车 | 电池梯次利用 | 增量学习 | 数字孪生 | 联邦学习 | 双流特征…

jenkins中执行python脚本导入路径错误

&#x1f9fe; 问题一&#xff1a;ModuleNotFoundError: No module named jenkins &#x1f50d; 现象&#xff1a; 在本地运行正常&#xff0c;但在 Jenkins 中运行脚本时报错&#xff0c;提示找不到 jenkins 模块。 ❓ 原因分析&#xff1a; Python 默认只从当前目录或已…

华为云Flexus+DeepSeek征文 | 华为云ModelArts Studio实战指南:创建高效的AingDesk知识库问答助手

华为云FlexusDeepSeek征文 | 华为云ModelArts Studio实战指南&#xff1a;创建高效的AingDesk知识库问答助手 前言一、ModelArts Studio介绍1. 华为云ModelArts Studio简介2. 华为云ModelArts Studio主要特点3. 华为云ModelArts Studio主要使用场景 二、AingDesk介绍1. AingDes…

NLP基础1_word-embedding

基于github项目&#xff1a;https://github.com/shibing624/nlp-tutorial/tree/main 自然语言处理任务 1) 简单任务 拼写检查 Spell Checking 关键词检索 Keyword Search 同义词查找 Finding Synonyms 2) 中级任务 解析来自网站、文档等的信息 3) 复杂任务 机器翻译 Ma…

ClickHouse系列--BalancedClickhouseDataSource实现

clickhouse-jdbc中负载均衡数据源的实现。 基本逻辑如下&#xff1a; 1.通过配置的url串&#xff0c;来切分构造url列表&#xff1b; 2.通过一个定时线程任务&#xff0c;来不断的去ping url列表&#xff0c;来更新可用的url列表&#xff1b; 3.在可用列表中随机返回一个可用ur…

Linux目录说明

Linux Filesystem Hierarchy Standard&#xff08;FHS&#xff09; 1. /bin 全称&#xff1a;Binary&#xff08;二进制文件&#xff09;功能&#xff1a;存放系统最基础的可执行命令&#xff0c;所有用户&#xff08;包括普通用户&#xff09;都能使用&#xff0c;用于系统启…

鸿蒙 Grid 与 GridItem 深度解析:二维网格布局解决方案

一、引言&#xff1a;网格布局 —— 多维度数据展示的黄金方案 在鸿蒙应用开发体系中&#xff0c;网格布局作为处理多元素有序排列的核心方案&#xff0c;广泛应用于电商商品陈列、图片画廊、功能矩阵等场景。鸿蒙提供的 Grid 与 GridItem 组件通过声明式语法构建灵活的二维布…

​​Vue 开发环境配置:使用 devServer.proxy 解决跨域问题​-vue中文件vue.config,js中配置devserver做反向代理到后端

​​Vue 开发环境配置&#xff1a;使用 devServer.proxy 解决跨域问题​​ ​​引言​​ 在现代 Web 开发中&#xff0c;前端和后端通常独立开发&#xff0c;前端运行在 http://localhost:8080&#xff0c;而后端可能运行在 http://localhost:8000 或其他端口。由于浏览器的 …

JVM 中的 GC 算法演进之路!(Serial、CMS、G1 到 ZGC)

引言 想象一下&#xff0c;Java 程序运行就像在一个巨大的图书馆里借书还书。这个图书馆&#xff08;JVM 的内存堆区&#xff09;为了高效运转&#xff0c;需要一个聪明的“图书管理员”来清理失效的书籍&#xff08;垃圾对象&#xff09;。这&#xff0c;就是垃圾回收器&#…

(9)python+playwright自动化测试-页面(page)

1.简介 通过前边的讲解和学习&#xff0c;细心认真地你可能发现在Playwright中&#xff0c;没有Element这个概念&#xff0c;只有Page的概念&#xff0c;Page不仅仅指的是某个页面&#xff0c;例如页面间的跳转等&#xff0c;还包含了所有元素、事件的概念&#xff0c;所以我们…

《自动控制原理 》- 第 1 章 自动控制的基本原理与方式

1-1 自动控制的基本原理与方式 自动控制是指在没有人直接参与的情况下&#xff0c;利用外加的设备或装置&#xff0c;使机器、设备或生产过程的某个工作状态或参数按照预定的规律运行。自动控制的核心原理是反馈控制&#xff0c;即通过将系统的输出量回送到输入端&#xff0c;与…

DL00715-基于YOLOv11的水面漂浮物目标检测含数据集

【论文必备】基于YOLOv11的水面漂浮物目标检测——让你的研究走在科技前沿&#xff01; 在环境监测、海洋保护和水质管理领域&#xff0c;水面漂浮物的检测一直是一个亟待解决的难题。传统的人工巡检方式不仅耗时费力&#xff0c;还无法覆盖广泛的水域范围。如今&#xff0c;基…

权电阻网络DAC实现电压输出型数模转换Multisim电路仿真——硬件工程师笔记

目录 1 基础知识 1.1 运算放大器在DAC中的作用 1.2 常见的基于运算放大器的DAC电路 1.2.1 倒T形电阻网络DAC 1.2.2 权电阻网络DAC 1.2.3 开关电容DAC 1.3 运算放大器的选择 1.4 设计注意事项 2 仿真实验 2.1 权电阻网络DAC实现数字0对应电压输出 2.2 权电阻网络DAC实…

Redis主从集群

✅ 一、什么是 Redis 主从集群&#xff1f; Redis 主从&#xff08;Master-Slave&#xff09;集群是一种最基础的集群方式&#xff1a; 一台 Redis 作为主节点&#xff08;Master&#xff09;&#xff0c;负责写操作&#xff1b; 一到多台 Redis 作为从节点&#xff08;Slave&…

【水印论文阅读1】将水印规则的定义域从离散的符号空间转移到连续的语义空间

【水印论文阅读1】将水印规则的定义域从离散的符号空间转移到连续的语义空间 写在最前面**为什么“token序列空间”有根本缺陷&#xff1f;****为什么“语义向量空间”能破局&#xff1f;****1. 连续性&#xff08;抗攻击的核心&#xff09;****2. 高维复杂性&#xff08;防破解…

Glide缓存机制

一、缓存层级与设计目标 双级缓存&#xff1a; 内存缓存&#xff1a;弱引用 LruCache 磁盘缓存&#xff1a;DiskLruCache 设计目标&#xff1a; 减少网络流量消耗 避免Bitmap频繁创建/销毁引发的GC 提升图片加载速度 二、内存缓存机制 1. 双缓存结构 缓存类型存储对象…

BaiduSitemap - Typecho站点地图生成与多搜索引擎推送插件

文章目录 🌐 BaiduSitemap - Typecho站点地图生成与多搜索引擎推送插件✨ 功能特点🧩 插件架构核心模块文件结构📦 安装方法方法一:手动安装方法二:Git克隆⚙️ 配置说明站点地图基本设置搜索引擎配置百度搜索引擎必应(Bing)搜索引擎谷歌(Google)搜索引擎🚀 使用…

androidx中<layout>根布局的意义及用法

在 Android 开发中,<layout> 根布局是 Android Jetpack Data Binding 库的核心组件,用于声明该 XML 布局文件将使用数据绑定功能。以下是详细说明: 📌 一、基本作用 1. 启用数据绑定 <layout> 标签标志着此布局文件支持数据绑定,编译器会为其生成对应的绑定类…