NumPy结构化数据类型是类似C struct的紧凑内存布局,支持多字段异构数据;需创建时定义,用方括号访问字段,不支持动态修改。

什么是NumPy结构化数据类型(structured dtype)
NumPy的结构化数据类型类似C语言的struct或数据库的一行记录,允许单个数组元素包含多个不同类型的字段(如name为字符串、age为整数、score为浮点数)。它不是Python字典或Pandas DataFrame,而是一种底层紧凑的内存布局,适合高性能数值计算和与C/Fortran代码交互。
关键点:结构化dtype必须在创建数组时就确定,不能动态增删字段;所有字段共享同一内存块,不支持嵌套可变长字符串(需用固定长度U20或S30)。
怎么定义结构化dtype:三种常用写法
最常用的是列表元组形式,清晰且兼容性好:
import numpy as np
<h1>写法1:字段名+类型(推荐)</h1><p>dt = np.dtype([('name', 'U10'), ('age', 'i4'), ('score', 'f8')])</p><p><span>立即学习</span>“<a href="https://pan.quark.cn/s/00968c3c2c15" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">Python免费学习笔记(深入)</a>”;</p><h1>写法2:字段名+类型+形状(用于数组字段,如坐标)</h1><p>dt_3d = np.dtype([('id', 'i4'), ('pos', ('f4', 3))]) # pos是长度为3的float32数组</p><h1>写法3:字典形式(字段顺序不保证,慎用于需要严格内存对齐的场景)</h1><p>dt_dict = np.dtype({'names': ['x', 'y'], 'formats': ['f4', 'f4'], 'offsets': [0, 4]})</p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/xiazai/skill7154" title="python-pro"><img
src="https://img.php.cn/upload/skill/000/000/081/179134208595348.jpg" alt="python-pro" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a href="/xiazai/skill7154" title="python-pro">python-pro</a>
<p>高级 Python 特性、异步编程、性能调优、静态类型、内存管理、Python 内部机制及生态库方面的专家。</p>
</div>
<a href="/xiazai/skill7154" title="python-pro" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div>注意:'U10'表示最多10个Unicode字符(Python 3默认),'S20'是20字节ASCII字节串;'i4'是32位有符号整数;字段名不能是Python关键字(如class会报错)。
怎么创建并访问结构化数组
用np.array传入数据和dtype,数据格式需匹配:
# 创建数组:传入元组列表或字典列表
data = [('Alice', 25, 92.5), ('Bob', 30, 88.0)]
arr = np.array(data, dtype=dt)
<h1>访问字段:用方括号加字段名(不是点号!)</h1><p>print(arr['name']) # ['Alice' 'Bob']
print(arr['age'][0]) # 25</p><h1>修改字段值(支持向量化赋值)</h1><p>arr['score'] *= 1.05</p>常见错误:
- 误用
arr.name→ 报AttributeError,必须用arr['name'] - 传入字典但字段顺序与dtype不一致 → 值错位(建议统一用元组列表)
- 字符串超长被截断(
'U10'中存11字符只留前10)
结构化数组的坑:对齐、视图与性能
默认情况下NumPy不自动填充字段对齐(padding),可能导致内存不连续。若需C兼容或与外部二进制格式对接,显式启用align=True:
dt_aligned = np.dtype([('a', 'i1'), ('b', 'i4')], align=True)
# 生成字段间插入3字节padding,总大小为8字节(而非5)
另一个易忽略点:结构化数组的.view()行为特殊。比如想把arr['score']当普通一维数组用,直接切片即可;但若想把整个结构化数组“重解释”为字节流,要用arr.view(np.uint8),且结果长度是arr.nbytes,不是arr.size。
字段名含空格或特殊字符时,必须用arr['field name'],不能用点号;dtype一旦创建就不能修改字段名或类型——得重建数组。

















