Numpy 中的结构化数组
NumPy 是 Python 中用于科学计算的基本包,它提供了处理同质多维数组的强大工具。虽然 NumPy 数组擅长高效处理统一数据类型,但在某些情况下我们需要处理包含异构类型的结构化数据。这就是结构化数组发挥作用的地方。
NumPy 中的结构化数组允许我们处理表格或结构化数据,其中数组的每个元素可以具有多个具有不同数据类型的字段。此功能使 NumPy 成为一个多功能库,可处理各种数据,包括 CSV 文件、数据库表等。
创建结构化数组
要在 NumPy 中创建结构化数组,我们需要定义一个 dtype(数据类型),指定每个字段的名称和类型。让我们考虑一个例子,我们想要表示一个包含姓名、年龄和年级等字段的学生记录数据集。以下是我们如何为这种结构化数组定义 dtype −
import numpy as np dtype = np.dtype([('name', 'U20'), ('age', np.int32), ('grade', np.float64)])
在此示例中,我们定义了一个包含三个字段的 dtype:'name' 为长度为 20 个字符的 Unicode 字符串,'age' 为 32 位整数,'grade' 为 64 位浮点数。
现在,我们可以使用此 dtype 创建结构化数组 −
data = np.array([('Alice', 25, 4.8), ('Bob', 23, 3.9), ('Charlie', 27, 4.5)], dtype=dtype)
数据数组是一个包含三个元素的结构化数组,其中每个元素都有字段"name"、"age"和"grade"及其各自的值。
操作结构化数组
除了访问和修改单个字段外,NumPy 中的结构化数组还提供了各种方法来操作整个数据。让我们探索一些常见的操作−
排序
我们可以使用 np.sort() 函数根据一个或多个字段对结构化数组进行排序。例如,让我们根据"age"字段按降序对数据数组进行排序 −
示例
sorted_data = np.sort(data, order='age')[::-1] print(sorted_data)
输出
[('Charlie', 27, 4.5) ('Alice', 25, 4.8) ('Bob', 24, 3.9)]
聚合
NumPy 提供了几个聚合函数,例如 np.mean()、np.sum() 和 np.max(),可用于计算结构化数组的统计数据。下面是一个计算平均年龄和最高成绩的示例−
average_age = np.mean(data['age']) maximum_grade = np.max(data['grade']) print(average_age) # 输出:25.0 print(maximum_grade) # 输出:4.8
过滤
我们可以使用布尔索引根据某些条件过滤结构化数组。例如,让我们筛选出年龄小于 26 岁的学生 −
示例
filtered_data = data[data.age < 26] print(filtered_data)
输出
[('Alice', 25, 4.8) ('Bob', 24, 3.9)]
连接
我们可以使用 np.concatenate() 函数水平或垂直连接多个结构化数组。例如,让我们创建另一个结构化数组并将其与数据数组垂直连接 −
示例
new_data = np.array([('David', 28, 4.3), ('Eve', 22, 3.7)], dtype=dtype) concatenated_data = np.concatenate((data, new_data)) print(concatenated_data)
输出
[('Alice', 25, 4.8) ('Bob', 23, 3.9) ('Charlie', 27, 4.5) ('David', 28, 4.3) ('Eve', 22, 3.7)]
重塑
我们可以使用 np.reshape() 函数重塑结构化数组。例如,让我们将数据数组重塑为 2x3 数组 −
示例
reshaped_data = np.reshape(data, (2, 3)) print(reshaped_data)
输出
[[('Alice', 25, 4.8) ('Bob', 23, 3.9) ('Charlie', 27, 4.5)] [('David', 28, 4.3) ('Eve', 22, 3.7) ('', 0, 0.0)]]
这些只是您可以对结构化数组执行的操作的几个示例。NumPy 提供了一组丰富的函数和方法来有效地操作和分析结构化数据。
结构化数组的用例
结构化数组在涉及表格或结构化数据的场景中特别有用。一些常见的用例包括 -
数据导入/导出
当处理来自外部来源(如 CSV 文件或数据库)的结构化数据时,我们可以使用结构化数组有效地读取、操作和处理数据。
数据分析
结构化数组提供了一种执行各种数据分析任务的便捷方法。我们可以使用它们根据不同的字段对数据进行过滤、排序、分组和聚合,从而使我们能够从数据中获得洞察力并提取有意义的信息。
模拟和建模
在科学模拟或建模任务中,结构化数组可用于表示不同的变量或参数。这使我们能够有效地组织和操作数据,从而促进复杂的计算和模拟。
记录保存和数据库
结构化数组对于记录保存应用程序或使用小型数据库时很有用。它们提供了一种有组织且有效的方式来存储、查询和修改具有多个字段的记录。
广播和矢量化操作
NumPy 的广播和矢量化操作可以无缝应用于结构化数组。这样可以同时对多个字段进行高效的元素级计算和操作。
例如,假设我们有一个结构化数组,表示带有"temperature_celsius"和"temperature_fahrenheit"等字段的温度数据集。我们可以使用广播轻松地将温度从摄氏温度转换为华氏温度 −
data['temperature_fahrenheit'] = data['temperature_celsius'] * 9/5 + 32
内存效率
NumPy 中的结构化数组具有内存效率,因为它们将数据存储在连续的内存块中。与其他数据结构相比,这可以加快数据访问速度并提高性能。
需要注意的是,如果结构化数组包含长度不等的大型字段(例如字符串字段),则将结构化数组与 NumPy 的 object 数据类型结合使用可能会更节省内存,或者利用 pandas 等专门的库进行更高效的处理。
自定义数据类型
NumPy 允许使用用户定义的字段定义自定义数据类型。此功能支持在结构化数组中灵活地表示复杂的数据结构,例如嵌套数组、分层数据甚至自定义对象。
例如,让我们考虑一个表示员工记录的结构化数组,其中有一个名为"projects"的字段,其中包含每个员工的项目名称列表。我们可以定义一个自定义数据类型来处理这个嵌套结构。
与其他库集成
NumPy 中的结构化数组可与 Python 中其他流行的数据操作和分析库无缝集成,例如 pandas、scikit-learn 和 matplotlib。这种互操作性允许数据科学生态系统中不同工具之间顺畅的数据交换和兼容性。
例如,您可以使用 pd.DataFrame() 构造函数将结构化数组转换为 pandas DataFrame,以进行高级数据分析、可视化和机器学习任务。
性能注意事项
虽然结构化数组提供了灵活性和便利性,但它们可能不是非常大的数据集或复杂数据操作的最有效选择。在这种情况下,像 pandas 或数据库这样的专用库可能会提供更好的性能和可扩展性。
重要的是要考虑结构化数组的大小、操作的复杂性以及数据分析任务的特定要求,以确定最合适的方法。
结论
总之,NumPy 中的结构化数组使您能够高效、有效地处理结构化数据。通过利用结构化数组的灵活性和功能,您可以轻松处理复杂的数据操作、分析和建模任务。因此,请深入研究结构化数组的世界,并在您的 Python 项目中充分发挥结构化数据处理的潜力!