NumPy 中的结构化数组

PythonPythonBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,我们将学习 NumPy 中的结构化数组。结构化数组是一种 ndarray,其数据类型是由更简单的数据类型组成的组合,并组织成一系列命名字段。它们对于处理结构化数据(如表格数据)非常有用,其中每个字段代表数据的不同属性。

注意:你可以在 07-structured-arrays.ipynb 中编写代码。步骤中省略了一些打印操作,你可以根据需要打印输出。

创建结构化数组

要创建结构化数组,我们可以使用 np.array 函数,并通过 dtype 参数指定数据类型。数据类型应该是一个元组列表,其中每个元组代表结构化数组中的一个字段。每个元组应包含字段名称和字段的数据类型。

import numpy as np

## 创建一个结构化数组
x = np.array([('Alice', 25), ('Bob', 30)], dtype=[('name', 'U10'), ('age', int)])

访问字段

我们可以通过使用字段名进行索引来访问结构化数组的各个字段。这将返回一个只包含该字段值的新数组。

## 访问 'name' 字段
names = x['name']

修改字段

我们还可以通过使用字段名进行索引并赋新值来修改结构化数组的各个字段。

## 修改 'age' 字段
x['age'] = [26, 31]

使用多个字段进行索引

我们可以通过传递字段名列表来对结构化数组进行多个字段的索引。这将返回一个只包含指定字段的新结构化数组。

## 使用多个字段进行索引
subset = x[['name', 'age']]

比较结构化数组

如果两个结构化数组的数据类型相同,我们可以使用相等运算符(==)对它们进行比较。这将返回一个布尔数组,指示哪些元素在所有字段中具有相同的值。

## 比较两个结构化数组
y = np.array([('Alice', 25), ('Bob', 30)], dtype=[('name', 'U10'), ('age', int)])
comparison = x == y

创建记录数组

记录数组是 ndarray 的一个子类,它允许通过属性而非索引来访问字段。我们可以使用np.rec.array函数创建一个记录数组。

## 创建一个记录数组
recordarr = np.rec.array([('Alice', 25), ('Bob', 30)], dtype=[('name', 'U10'), ('age', int)])

通过属性访问字段

我们可以通过属性而非索引来访问记录数组的字段。这为处理结构化数据提供了一种更便捷的方式。

## 通过属性访问字段
names = recordarr.name

将结构化数组转换为记录数组

我们可以使用view方法并指定np.recarray类型,将结构化数组转换为记录数组。

## 将结构化数组转换为记录数组
recordarr = x.view(np.recarray)

将记录数组转换为结构化数组

要将记录数组转换回结构化数组,我们可以使用view方法并指定结构化数组的原始数据类型。

## 将记录数组转换为结构化数组
x = recordarr.view(dtype=[('name', 'U10'), ('age', int)])

总结

在本实验中,我们学习了如何在 NumPy 中创建和使用结构化数组。结构化数组对于处理结构化数据很有用,它们使我们能够访问和修改数组的各个字段。我们还了解了记录数组,它通过允许按属性而非索引访问字段,为处理结构化数据提供了一种更便捷的方式。