Python库学习(七):科学计算库Numpy[续篇一]:结构数组

1.介绍

结构数组是NumPy中的一种高级数据结构,它允许用户在单个数组中存储多种数据类型的元素。与普通的NumPy数组不同,结构数组的每个元素可以具有不同的数据类型,并且可以使用字段名来引用这些元素。这使得结构数组非常适合处理表格数据、数据库查询结果以及其他复杂数据结构。

2. 创建数组

2.1 字符串式声明

import numpy as np

if __name__ == '__main__':
    # 定义类型
    dt = "U10,i4,f"
    # 创建数组
    arr = np.array([
        [("Go"28.5)],
        [("Java"38.0)],
        [("Python"19.0)],
    ], dtype=dt)
    print(arr)

"""
[[('Go', 2, 8.5)]
 [('Java', 3, 8. )]
 [('Python', 1, 9. )]]
"""
    

@注:字符串式声明比较简单,只要使用逗号隔开即可,如上述示例:i1,i4,f

2.2 元组列表式声明

a. 声明类型:

 dt = np.dtype([("字段名""数据类型"),...,("字段名n""数据类型n")])  

b. 使用示例:

import numpy as np

if __name__ == '__main__':
    # 定义类型
    dt = np.dtype([("name""U10"), ("age", int), ("address""U20"), ("weight", float)])
    # 创建数组
    arr = np.array([
        [("张三"20"北京昌平区"74.5)],
        [("小花"18"上海徐汇区"48.5)]
    ], dtype=dt)
    print("创建数组:\n", arr)
    print("访问arr[0]:\n", arr[0])
    print("访问arr['name']:\n", arr['name'])
    print("访问arr['age']:\n", arr['age'])
    
"""
创建数组:
 [[('张三', 20, '北京昌平区', 74.5)]
 [('小花', 18, '上海徐汇区', 48.5)]]
访问arr[0]:
 [('张三', 20, '北京昌平区', 74.5)]
访问arr['name']:
 [['张三']
 ['小花']]
访问arr['age']:
 [[20]
 [18]]
"""
   

2.3 字段标题

元组列表除了上面的使用示例,还可以给字段加上标题,使用方式和语法如下:

a. 声明类型:

dt = np.dtype([(("标题""字段名"), "数据类型"), ... ,(("标题n""字段名n"), "数据类型")])  

b. 使用示例:

import numpy as np

if __name__ == '__main__':
    # 定义类型
    dt = np.dtype([(("姓名""name"), "U10"), (("年龄""age"), int), (("体重""weight"), float)])
    # 创建数组
    arr = np.array([
        [("张三"2880.23)],
        [("小明"1666.55)],
    ], dtype=dt)
    print("创建数组:\n", arr)
    print("访问 字段标题-> \n", arr["姓名"])
    print("访问 字段名-> \n", arr["name"])
    
"""
创建数组:
 [[('张三', 28, 80.23)]
 [('小明', 16, 66.55)]]
访问 字段标题-> 
 [['张三']
 ['小明']]
访问 字段名-> 
 [['张三']
 ['小明']]
"""
    

2.4 字典式声明

a. 声明类型:

 dt = {'names':('字段1',...'字段2'), 'formats':('类型1',...,'类型n')}

b. 使用示例:

import numpy as np

if __name__ == '__main__':
    # 定义类型
    dt = {"names": ("name""age""address""weight"), "formats": ("U10""i""U20""f")}
    # 创建数组
    arr = np.array([
        [("张三"20"北京昌平区"74.5)],
        [("小花"18"上海徐汇区"48.5)]
    ], dtype=dt)
    print("创建数组:\n", arr)
    print("访问arr[0]:\n", arr[0])
    print("访问arr['name']:\n", arr['name'])
    print("访问arr['age']:\n", arr['age'])

"""
创建数组:
 [[('张三', 20, '北京昌平区', 74.5)]
 [('小花', 18, '上海徐汇区', 48.5)]]
访问arr[0]:
 [('张三', 20, '北京昌平区', 74.5)]
访问arr['name']:
 [['张三']
 ['小花']]
访问arr['age']:
 [[20]
 [18]]
"""
    

3. 类型说明

3.1 类型汇总

以下是NumPy结构数组的常见数据类型的列表,包括类型、字符代码和说明。

类型字符代码说明
int'i'整数数据类型
int8'i1'8位有符号整数类型
int16'i2'16位有符号整数类型
int32'i4'32位有符号整数类型
int64'i8'64位有符号整数类型
uint8'u1'8位无符号整数类型
uint16'u2'16位无符号整数类型
uint32'u4'32位无符号整数类型
uint64'u8'64位无符号整数类型
float'f'浮点数数据类型
float16'f2'16位浮点数类型
float32'f4'32位浮点数类型
float64'f8'64位浮点数类型
complex'c'复数数据类型
complex64'c8'64位复数类型
complex128'c16'128位复数类型
bool'b'布尔值数据类型
object'O'通用对象数据类型
string'S'字符串数据类型
unicode'U'Unicode字符串数据类型
void'V'通用无类型数据类型
datetime'M'日期和时间数据类型
timedelta'm'时间间隔数据类型

数据类型的字符代码,用在NumPy中,表示对应的数据类型。

3.2 时间类型使用

import numpy as np

if __name__ == '__main__':
    # 定义类型
    dt = [
        ('day''datetime64[D]'),  # 表示日期,精确到天
        ('minutes''datetime64[m]'),  # 表示时间,精确到分钟
        ('second''datetime64[s]')  # 表示时间,精确到秒
    ]
    arr = np.array([
        ('2023-09-25''2023-09-25T14:30''2023-09-25T14:30:00'),
        ('2023-09-25''2023-09-25T17:30''2023-09-25T14:30:45')
    ], dtype=dt)
    print("arr: ", arr)
    print("计算时间差:", arr['minutes'][1] - arr['minutes'][0])
    print("计算时间差:", arr['second'][1] - arr['second'][0])
    
"""
arr:  [('2023-09-25', '2023-09-25T14:30', '2023-09-25T14:30:00')
 ('2023-09-25', '2023-09-25T17:30', '2023-09-25T14:30:45')]
计算时间差: 180 minutes
计算时间差: 45 seconds
"""
    

'datetime64[D]:'精确到天,而'datetime64[m]:',精确到分钟,datetime64[s]: 精确到秒

4. 字符串

Numpy使用字符串类型时,常见会是这种格式S10、U20等,其中的10,20指的就是字符的长度,单位是字节。

4.1 对比示例

NumPy结构数组中,使用字符串类型时一定要指定长度,因为字符串类型,需要在内存中预先分配内存,换句话说如果你不指定长度,那么值是存不进去的,如下示例:

import numpy as np

if __name__ == '__main__':
    # 定义字符串--不指定长度
    arr = np.array([
        [("张三"80.5)],
        [("李四"67.5)],
    ], dtype="U,f")
    print("定义字符串--不指定长度: \n", arr)
    # 定义字符串--指定长度
    arr2 = np.array([
        [("李白"90)],
        [("苏轼"88)],
    ], dtype="U10,f")
    print("定义字符串--指定长度: \n", arr2)
    
"""
定义字符串--不指定长度: 
 [[('', 80.5)]
 [('', 67.5)]]
定义字符串--指定长度: 
 [[('张三', 80.5)]
 [('李四', 67.5)]]
"""
    

4.2 原因汇总

使用字符串指定长度的原因,除了上面说的内存预分配的原因,还有其他原因,下面进行了汇总:

  1. 内存分配:字符串类型的长度决定了每个字符串在内存中占用的空间大小。如果不指定长度, NumPy无法确定要为每个字符串分配多少内存,这会导致内存分配错误或不确定性,可能会破坏数据的完整性。
  2. 数据存储:在结构数组中,每个元素都有固定的字节大小,这包括字符串字段。指定字符串长度允许 NumPy为每个元素的字符串字段分配相应大小的内存块,确保数据存储的正确性。
  3. 数据对齐:结构数组中的字段通常需要按照字节边界对齐,以提高内存访问效率。指定字符串长度有助于确保每个字符串字段与其他字段正确对齐,以防止不必要的内存开销和性能下降。
  4. 数据操作:指定字符串长度还有助于NumPy正确执行数据操作,如拷贝、切片和比较。没有指定长度的字符串可能会导致不明确的行为或错误。

4.3 S、U的区别

NumPy中,字符串类型有两种常见的类型,分别是S(string)(字节字符串)和U(Unicode)(字符串)。这两种类型在处理字符串数据时具有不同的特性和用途,以下是它们的对比:

  1. S 字符串(字节字符串)
    • 字符编码:S字符串使用字节编码,通常用于处理 ASCII字符集。这意味着它不支持多语言字符或特殊字符,只能表示 ASCII字符。
    • 存储效率S字符串在内存中以字节为单位存储,因此在存储方面比 U字符串更加紧凑,但只能表示有限的字符集。
    • 示例'S10' 表示包含最多10个ASCII字符的S字符串,例如 'Hello'
    • 适用场景:当你知道字符串只包含ASCII字符或需要节省内存时,可以选择使用S字符串。常见用途包括文件名、用户名、产品代码等。
  2. U 字符串(Unicode字符串)
    • 字符编码U字符串使用 Unicode编码,支持多语言字符、特殊字符和表情符号等。它更加通用,适用于处理各种语言的文本。
    • 存储效率U字符串在内存中以 Unicode字符的形式存储,因此通常会占用更多的内存。但它具有更广泛的字符支持。
    • 示例'U20' 表示包含最多20个 Unicode字符的 U字符串,例如 '你好,世界'
    • 适用场景:当你需要处理多语言字符、特殊字符、国际化文本或包含 Unicode字符的数据时,通常应选择使用 U字符串。它适用于 Web应用、国际化应用程序、文本处理等场景。

@注:当你需要存储中文字符时, 使用Unicode

5. 字节顺序

5.1 概念说明

大端字节顺序(Big-Endian)和小端字节顺序(Little-Endian)是两种用于存储多字节数据(如整数、浮点数)的不同方式。它们决定了在内存中多字节数据的字节存储顺序。

5.2 大端字节顺序

在大端字节顺序中,数据的高位字节(Most Significant Byte,MSB)存储在内存的低地址处,而低位字节(Least Significant Byte,LSB)存储在内存的高地址处。这就好像你阅读英文文本,从左到右逐个字母阅读一样。

示例: 假设我们要存储整数值0x1234(十进制为4660),在大端字节顺序下,在内存中的存储方式是:

高地址 --> 0x12 | 0x34 <-- 低地址

这意味着0x12(高位字节)存储在较低的内存地址,0x34(低位字节)存储在较高的内存地址。

5.3 小端字节顺序

在小端字节顺序中,数据的低位字节(LSB)存储在内存的低地址处,而高位字节(MSB)存储在内存的高地址处。这就好像你逆序阅读英文文本,从右到左逐个字母阅读一样。

示例: 同样,我们要存储整数值0x1234。在小端字节顺序下,在内存中的存储方式是:

高地址 --> 0x34 | 0x12 <-- 低地址

这意味着0x34(低位字节)存储在较低的内存地址,0x12(高位字节)存储在较高的内存地址。

5.4 字节顺序重要性

为什么字节顺序很重要?因为不同的硬件架构可能使用不同的字节顺序,而且在数据交换和文件传输等场景中,正确的字节顺序非常关键,否则数据可能会被错误地解释或损坏。

大多数现代计算机采用小端字节顺序,例如x86架构的计算机。但某些其他体系结构,如某些PowerPCARM架构,采用大端字节顺序。因此,在处理二进制数据时,特别是与不同架构的系统进行数据交换时,了解和处理字节顺序是非常重要的。

5.5 Numpy中使用

NumPy中,默认情况下,多字节数据类型的字节顺序是与计算机的硬件平台相关的,即它会自动选择适合硬件平台的字节顺序。这被称为 本地字节顺序。你也可以使用以下方法来显式指定字节顺序:

  • >:指定大端字节顺序。
  • <:指定小端字节顺序。

例如,在创建结构数组或使用特定数据类型时,你可以明确指定字节顺序,如下所示:

import numpy as np

# 创建一个16位整数数组,指定大端字节顺序
arr_big_endian = np.array([123], dtype='>i2')

# 创建一个32位浮点数数组,指定小端字节顺序
arr_little_endian = np.array([1.02.03.0], dtype='<f4')

在不同的应用场景中,特定的字节顺序可能会受到影响,尤其是在处理二进制数据或与其他系统进行交互时。因此,了解和控制字节顺序是非常重要的。

微信搜索【猿码记】查看更多文章

本文由 mdnice 多平台发布

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

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

相关文章

TCP 和 UDP哪个更好

传输控制协议 &#xff08;TCP&#xff09; 和用户数据报协议 &#xff08;UDP&#xff09; 是互联网的基础支柱&#xff0c;支持从网络源到目的地的不同类型的数据传输。TCP更可靠&#xff0c;而UDP优先考虑速度和效率。本文解释了两种协议的工作原理&#xff0c;并详细讨论了…

【遥遥领先】Eolink IDEA 插件:零代码入侵,自动生成接口

省流版&#xff1a; Eolink 有 IDEA 插件吗&#xff1f; 有&#xff0c;而且遥遥领先&#xff01;我们在一年半之前就发布了&#xff0c;而且功能更丰富&#xff01; IDEA 插件市场搜索“Eolink Apikit”即可安装使用。 &#x1f680;使用指引&#xff1a;Eolink - IntelliJ ID…

virtualbox无界面打开linux虚拟机的bat脚本,以及idea(代替Xshell)连接linux虚拟机的方法

virtualbox无界面打开linux虚拟机的bat脚本&#xff0c;以及idea连接linux虚拟机的方法 命令行运行代码成功运行的效果图 idea连接linux虚拟机的方法【重要】查看虚拟机的IP地址idea中选择菜单&#xff08;该功能可代替Xshell软件&#xff09;配置设置连接成功进入idea中的命令…

20230925工作心得

1、如果使用map的时候&#xff0c;担心key重复&#xff0c;覆盖掉值 那么直接加个if/else判断就好了。 如果map.containsKey&#xff0c;那么就把值追加上去&#xff0c;否则就直接put。 2、list的removeAll方法 list.removeAll(list2);//list要removeAll谁,就是看list自己比…

【含2023java面试题】分布式锁方案设计:防止取消订单误支付Bug

AI绘画关于SD,MJ,GPT,SDXL百科全书 面试题分享点我直达 2023Python面试题 2023最新面试合集链接 2023大厂面试题PDF 面试题PDF版本 java、python面试题 项目实战:AI文本 OCR识别最佳实践 AI Gamma一键生成PPT工具直达链接 玩转cloud Studio 在线编码神器 玩转 GPU AI…

Java on Azure Tooling 8月更新|以应用程序为中心的视图支持及 Azure 应用服务部署状态改进

作者&#xff1a;Jialuo Gan - Program Manager, Developer Division at Microsoft 排版&#xff1a;Alan Wang 大家好&#xff0c;欢迎阅读 Java on Azure 工具的八月更新。在本次更新中&#xff0c;我们将推出新的以应用程序为中心的视图支持&#xff0c;帮助开发人员在一个项…

德大黄鱼开捕 年产量20万吨 京东超市多举措保障黄鱼品质

作为“中国大黄鱼之都”&#xff0c;宁德大黄鱼占全国大黄鱼总产值产量均在90%以上。有关方面预计&#xff0c;今年全年宁德大黄鱼产量达20万吨&#xff0c;年增产10%&#xff0c;直接经济产值超百亿元。 宁德大黄鱼开捕活动&#xff0c;由宁德市政府、宁德渔业协会、京东超市…

文举论金:黄金原油全面走势分析策略指导。

分析永远是辅助&#xff0c;策略才是盈利的基本。对于技术&#xff0c;没有对错&#xff0c;关键性的分水岭&#xff0c;易成为行情转折的拐点抑或助推趋势的延伸。但是&#xff0c;交易中或实盘操作中&#xff0c;咱们必须果断&#xff0c;在对的方向里坚持&#xff0c;而当方…

leetCode 968.监控二叉树(利用状态转移+贪心)

968. 监控二叉树 - 力扣&#xff08;LeetCode&#xff09; 给定一个二叉树&#xff0c;我们在树的节点上安装摄像头。节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。计算监控树的所有节点所需的最小摄像头数量。 >>解题思路: 重要线索->题目示例中的摄…

不甘于被强势厂商捆绑,中国移动未来或自研5G基站

一直以来运营商被认为只是做服务&#xff0c;而设备等都是由设备商提供的&#xff0c;甚至由于如今的设备高度复杂&#xff0c;设备商已承包越来越多的基站运维工作&#xff0c;运营商的技术水平越来越低&#xff0c;不过随着中国移动发布5G射频芯片8676&#xff0c;似乎显示出…

JVM之选择合适的垃圾收集器(CMS、G1)

1.JVM内存模型&#xff0c;栈、本地方法栈、程序计数器、堆、元空间、方法区、本地方法区&#xff0c;除程序计数器外&#xff0c;其他区域都能进行垃圾收集 2.栈&#xff0c;它的生命周期与线程相同&#xff0c;线程私有&#xff0c;会使用操作系统原生内存&#xff0c;方法…

python过滤敏感词

敏感词一般是指带有敏感政治倾向&#xff08;或反执政党倾向&#xff09;、暴力倾向、不健康色彩的词或不文明用语&#xff0c;论坛、网站管理员一般会设定一些敏感词&#xff0c;以防不当发言影响论坛、网站环境。若论坛、网站设置了敏感词&#xff0c;用户编辑的内容又含有敏…

Kafka Shell命令交互

Kafka提供了一个命令行工具,用于管理和与Kafka集群交互。这个命令行工具通常称为Kafka Shell,它允许您执行各种操作,如创建主题、发送和消费消息、查看主题列表等。 以下是一些常用的Kafka Shell命令: 创建主题(Topic): kafka-topics.sh --create --topic my-topic --pa…

Levels - UE5中的建模相关

一些日常的笔记&#xff1b; 可以使用Shapes面板建立基础模型&#xff1a; 可以在PolyModel中继续细分模型&#xff1a; UE5中的建模有PolyGroups概念&#xff0c;可以在Attributes面板中直接编辑&#xff1a; 使用GrpPnt方式可以直接用笔刷设定新的PolyGroups&#xff0c;这样…

抖音SEO矩阵系统源码开发搭建

1. 确定需求和功能&#xff1a;明确系统的主要目标和需要实现的功能&#xff0c;包括关键词研究、短视频制作、外链建设、数据分析、账号设置优化等方面。 2. 设计系统架构&#xff1a;根据需求和功能确定系统的架构&#xff0c;包括前端、后端、数据库等部分的设计&#xff0…

计算机组成原理之硬件的内部结构,拆开单独的硬件,查看硬件组成部分的结构和功能。

大家好&#xff0c;欢迎阅读《计算机组成原理》的系列文章&#xff0c;本系列文章主要教内容是从零学习计算机组成原理&#xff0c;内容通俗易懂&#xff0c;大家好好学习吧&#xff01;&#xff01;&#xff01; 更多的优质内容&#xff0c;请点击以下链接查看哦~~ ↓ ↓ ↓ …

计算机视觉与深度学习-经典网络解析-ZFNet-[北邮鲁鹏]

这里写目录标题 ZFNet主要改进减小第一层卷积核将第二、第三个卷积层的卷积步长都设置为2增加了第三、第四个卷积层的卷积核个数 ZFNet ZFNet是一种基于AlexNet的模型&#xff0c;由Matthew D. Zeiler和Rob Fergus在2013年提出。相对于AlexNet&#xff0c;ZFNet结构与AlexNet网…

由于找不到msvcr110.dll 无法继续执行的解决方法分享(最新)

msvcp110.dll 是 Microsoft Visual C 2010 Redistributable Package 中的一个组件&#xff0c;它包含了一些运行时库文件。当计算机缺少这个文件时&#xff0c;可能会出现一些问题&#xff0c;如程序无法正常运行、系统不稳定等。下面是 6 种修复方法&#xff1a; 第1种方法&am…

【注射论文基因,那些年不为人知的AI工具】

我们都知道写论文有很多前期准备工作&#xff0c;例如<任务书>、<文献综述>等等&#xff0c;那么我们能够用什么工具最大限度的提高完成效率的同时还能保证质量呢&#xff0c;让我们接着往下看&#x1f447; 1.文献快速阅读-iTextMaster 文章主题确定了&#xff0…

Python函数式编程(一)概念和itertools

Python函数式编程是一种编程范式&#xff0c;它强调使用纯函数来处理数据。函数是程序的基本构建块&#xff0c;并且尽可能避免或最小化可变状态和副作用。在函数式编程中&#xff0c;函数被视为一等公民&#xff0c;可以像值一样传递和存储。 函数式编程概念 编程语言支持通…