11.4 结构化数组与记录数组 (Structured and Record Arrays)


文档摘要

11.4 结构化数组与记录数组 (Structured and Record Arrays) NumPy 性能优化与高级主题:11.4 结构化数组与记录数组 NumPy 的结构化数组和记录数组是处理具有异构数据类型数据集的强大工具。它们允许你将多个不同类型的数据字段组合成一个单一的 NumPy 数组,类似于 C 语言中的结构体或数据库中的表。本节将深入探讨结构化数组和记录数组的概念、创建、使用以及性能考量。 结构化数组 (Structured Arrays) 结构化数组允许你创建一个数组,其中每个元素包含多个字段,每个字段可以有不同的数据类型。这对于表示复杂的数据结构非常有用,例如数据库记录、科学数据或任何需要将多个相关数据点组合在一起的情况。 1.

11.4 结构化数组与记录数组 (Structured and Record Arrays)

NumPy 性能优化与高级主题:11.4 结构化数组与记录数组

NumPy 的结构化数组和记录数组是处理具有异构数据类型数据集的强大工具。它们允许你将多个不同类型的数据字段组合成一个单一的 NumPy 数组,类似于 C 语言中的结构体或数据库中的表。本节将深入探讨结构化数组和记录数组的概念、创建、使用以及性能考量。

1. 结构化数组 (Structured Arrays)

结构化数组允许你创建一个数组,其中每个元素包含多个字段,每个字段可以有不同的数据类型。这对于表示复杂的数据结构非常有用,例如数据库记录、科学数据或任何需要将多个相关数据点组合在一起的情况。

1.1 定义结构化数组

定义结构化数组的关键在于指定其数据类型 (dtype)。dtype 描述了数组中每个元素的字段名称和类型。

import numpy as np # 定义一个结构化数据类型,包含 name (字符串), age (整数), 和 weight (浮点数) dt = np.dtype([('name', 'S10'), ('age', 'i4'), ('weight', 'f4')]) # 创建一个空的结构化数组 people = np.zeros((3,), dtype=dt) print(dt) print(people)

输出:

[('name', 'S10'), ('age', '<i4'), ('weight', '<f4')] [(b'', 0, 0.) (b'', 0, 0.) (b'', 0, 0.)]

在这个例子中,我们使用 np.dtype 定义了一个名为 dt 的数据类型。 ('name', 'S10') 表示名为 name 的字段,其数据类型是长度为 10 的字符串。 ('age', 'i4') 表示名为 age 的字段,其数据类型是 4 字节整数。 ('weight', 'f4') 表示名为 weight 的字段,其数据类型是 4 字节浮点数。

1.2 填充结构化数组

可以通过多种方式填充结构化数组,包括直接赋值、使用列表或元组以及从其他数组复制。

people['name'] = ['Alice', 'Bob', 'Charlie'] people['age'] = [25, 30, 28] people['weight'] = [65.5, 70.2, 68.0] print(people)

输出:

[(b'Alice', 25, 65.5) (b'Bob', 30, 70.2) (b'Charlie', 28, 68. )]

1.3 访问结构化数组

可以使用字段名称来访问结构化数组的特定字段。

print(people['name']) print(people['age']) print(people[0]['name']) # 访问第一个元素的 name 字段

输出:

[b'Alice' b'Bob' b'Charlie'] [25 30 28] b'Alice'

1.4 结构化数组的优势

  • 数据组织性: 将相关数据组织在一起,提高代码可读性和可维护性。

  • 数据类型灵活性: 允许在单个数组中存储不同类型的数据。

  • 与外部数据源集成: 方便读取和处理来自文件、数据库等外部数据源的数据。

2. 记录数组 (Record Arrays)

记录数组是结构化数组的变体,它允许你使用属性访问字段,而不是使用字典式的索引。 换句话说,你可以使用 array.fieldname 来访问字段,而不是 array['fieldname']

2.1 创建记录数组

可以使用 np.rec.array 从结构化数组或列表创建记录数组。

# 从结构化数组创建记录数组 record_people = people.view(np.recarray) # 或者直接创建记录数组 record_people = np.rec.array([('Alice', 25, 65.5), ('Bob', 30, 70.2), ('Charlie', 28, 68.0)], dtype=[('name', 'S10'), ('age', 'i4'), ('weight', 'f4')]) print(record_people)

输出:

rec.array([(b'Alice', 25, 65.5), (b'Bob', 30, 70.2), (b'Charlie', 28, 68. )], dtype=[('name', 'S10'), ('age', '<i4'), ('weight', '<f4')])

2.2 访问记录数组

使用属性访问字段:

print(record_people.name) print(record_people.age) print(record_people[0].name)

输出:

[b'Alice' b'Bob' b'Charlie'] [25 30 28] b'Alice'

2.3 记录数组的优势

  • 更简洁的语法: 使用属性访问字段,代码更易读。

  • 更符合面向对象编程的习惯: 将数据和相关操作封装在一起。

2.4 记录数组的缺点

  • 性能略低于结构化数组: 属性访问比字典式索引略慢。

  • 不推荐使用: NumPy官方推荐使用结构化数组,因为记录数组的一些行为可能不一致,并且在未来的版本中可能会被移除。

3. 结构化数组和记录数组的应用场景

  • 数据库模拟: 可以使用结构化数组和记录数组来模拟数据库表,进行数据存储和查询。

  • 科学数据分析: 处理包含多种类型数据的科学数据集,例如实验数据、传感器数据等。

  • 数据交换: 在不同的系统之间交换数据,例如将数据从 Python 传递到 C 或 Fortran 代码。

  • 图形图像处理: 表示图像像素数据,每个像素包含颜色、深度等信息。

4. 性能考量

虽然结构化数组和记录数组提供了方便的数据组织方式,但在性能方面需要注意以下几点:

  • 内存布局: 结构化数组的内存布局是连续的,这使得访问相邻字段的数据更高效。 但是,如果字段大小差异很大,可能会导致内存浪费。

  • 数据类型选择: 选择合适的数据类型非常重要,避免使用过大的数据类型,浪费内存和计算资源。

  • 避免频繁的字段访问: 频繁访问结构化数组的字段可能会降低性能。 尽量批量处理数据,减少字段访问的次数。

  • 使用NumPy的向量化操作: 尽可能使用NumPy的向量化操作来处理结构化数组的数据,避免使用循环。

5. 代码实践

5.1 读取CSV文件并创建结构化数组

import numpy as np # 假设有一个CSV文件,包含 name, age, weight 三列 # name,age,weight # Alice,25,65.5 # Bob,30,70.2 # Charlie,28,68.0 # 定义数据类型 dt = np.dtype([('name', 'S10'), ('age', 'i4'), ('weight', 'f4')]) # 使用 genfromtxt 读取CSV文件 data = np.genfromtxt('data.csv', delimiter=',', skip_header=1, dtype=dt, encoding='utf-8') print(data)

5.2 结构化数组的排序

import numpy as np dt = np.dtype([('name', 'S10'), ('age', 'i4'), ('weight', 'f4')]) people = np.array([('Alice', 25, 65.5), ('Bob', 30, 70.2), ('Charlie', 28, 68.0)], dtype=dt) # 按年龄排序 sorted_people = np.sort(people, order='age') print("按年龄排序:", sorted_people) # 按姓名排序 sorted_people = np.sort(people, order='name') print("按姓名排序:", sorted_people)

6. 总结

结构化数组和记录数组是 NumPy 中处理异构数据的强大工具。 它们允许你将不同类型的数据字段组合成一个单一的数组,方便数据组织和处理。 虽然记录数组提供了更简洁的属性访问语法,但结构化数组通常具有更好的性能,并且是 NumPy 官方推荐的使用方式。 在选择使用哪种方式时,需要根据实际应用场景和性能需求进行权衡。

7. Mermaid 图示

以下是一个使用 Mermaid 绘制的结构化数组数据结构的示意图:

这个图示展示了一个包含三个元素的结构化数组,每个元素包含 nameageweight 三个字段。 它清晰地表达了结构化数组的数据组织方式。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U