NumPy - 创建结构化数组
结构化数组简介
NumPy 中的结构化数组允许在单个数组中表示不同类型和大小的数据。结构化数组中的每个元素可以是一个具有多个字段的记录,每个字段都有自己的数据类型。
这类似于一个表格,其中每行代表一个具有各种属性的记录。关键点如下 −
- 结构化数组中的每个元素(记录)可以具有多个字段。
- 字段可以具有不同的数据类型(例如,整数、浮点数、字符串)。
- 结构化数组适用于表示复杂的数据结构。
定义结构化数组
创建结构化数组的第一步是定义结构化数组的数据类型。这使用 NumPy 的 dtype 对象完成,该对象指定数组中字段的名称和类型,如以下示例所示 −
import numpy as np
# 定义结构化数组的数据类型
dtype = np.dtype([('name', 'U10'), ('age', 'i4'), ('height', 'f4')])
这里,dtype 是一个具有三个字段的结构化数据类型 −
- name: 最多 10 个字符的字符串 ('U10')
- age: 整数 ('i4')
- height: 浮点数 ('f4')
创建结构化数组
定义好 "dtype" 后,您可以通过将 dtype 传递给 np.array() 函数来创建结构化数组。以下是语法 −
numpy.array( object, dtype=None, copy=True, order='K', subok=False, ndmin=0 )
其中,
- object: 这是您想要转换为 NumPy 数组的输入数据。它可以是列表、元组或任何其他类似序列的结构。
- dtype (可选): 指定数组的期望数据类型。如果未提供,NumPy 将从输入数据中推断数据类型。例如,可以使用 'int32'、'float64'、'str' 等。
- copy (可选): 如果为 True(默认),则创建一个新数组。如果为 False,则仅在必要时创建新数组(即,如果输入对象不是数组)。如果为 False,np.array 可能会返回原始数组的视图(如果可能)。
- order (可选): 指定内存布局顺序。可以是 'C' 表示行优先(C 风格)顺序,'F' 表示列优先(Fortran 风格)顺序,或 'K' 表示输入中发现的顺序。默认为 'K'。
- subok (可选): 如果为 True,则如果输入是子类,将使用 ndarray 的子类。默认为 False,表示返回的数组始终是 ndarray 的实例。
- ndmin (可选): 指定结果数组应具有的最小维度数。例如,设置 ndmin=2 可确保结果至少是一个二维数组。
示例
在以下示例中,我们定义了一个带有指定 dtype 的结构化数组,该 dtype 包含 "name"、"age" 和 "height" 字段。然后,我们使用与此结构匹配的数据创建数组,并打印结果结构化数组 −
import numpy as np
# 定义带有字段名称和数据类型的 dtype
dtype = [('name', 'U10'), ('age', 'i4'), ('height', 'f4')]
# 创建与 dtype 一致的数据
data = [('Alice', 30, 5.6), ('Bob', 25, 5.8), ('Charlie', 35, 5.9)]
# 创建结构化数组
structured_array = np.array(data, dtype=dtype)
print("Structured Array:\n", structured_array)
以下是获得的结果 −
Structured Array:
[('Alice', 30, 5.6) ('Bob', 25, 5.8) ('Charlie', 35, 5.9)]
使用不同数据类型创建结构化数组
你可以根据应用程序的需求创建包含各种数据类型的结构化数组,包括字符串、整数和浮点数。
在结构化数组的上下文中 −
- Strings: 你可以在结构化数组中存储文本数据。例如,姓名字段可能使用 string 数据类型。
- Integers: 数值数据,如年龄或计数,可以存储为整数。这可能包括像年龄或数量这样的整数数据。
- Floats: 对于小数或实数,你可以使用 float 数据类型。这对于测量值或需要精度的任何值(如身高或体重)非常有用。
示例
在以下示例中,我们创建了一个结构化数组,其数据类型 (dtype) 包含混合数据类型:ID 使用整数,姓名使用字符串,分数使用浮点数 −
import numpy as np
# 定义包含混合数据类型的 dtype
dtype = [('id', 'i4'), ('name', 'U15'), ('score', 'f8')]
data = [(1, 'Alice', 88.5), (2, 'Bob', 91.2), (3, 'Charlie', 85.4)]
# 创建结构化数组
structured_array = np.array(data, dtype=dtype)
print("Structured Array with Mixed Data Types:\n", structured_array)
这将产生以下结果 −
Structured Array with Mixed Data Types:[(1, 'Alice', 88.5) (2, 'Bob', 91.2) (3, 'Charlie', 85.4)]
使用元组列表创建结构化数组
你可以使用元组列表来定义 dtype 并创建结构化数组,其中每个元组表示一个字段。每个元组包含两个元素:第一个元素是字段名称,第二个元素是该字段的数据类型。
示例
在以下示例中,我们使用指定的 dtype 定义了一个包含 "name"、"age" 和 "height" 字段的结构化数组。然后使用相应的数据创建该数组 −
import numpy as np
# 定义 dtype
dtype = [('name', 'U10'), ('age', 'i4'), ('height', 'f4')]
# 定义数据
data = [('Alice', 30, 5.6), ('Bob', 25, 5.8), ('Charlie', 35, 5.9)]
# 创建结构化数组
structured_array = np.array(data, dtype=dtype)
print("Structured Array:\n", structured_array)
以下是获得的结果 −
Structured Array:
[('Alice', 30, 5.6) ('Bob', 25, 5.8) ('Charlie', 35, 5.9)]
使用字典创建结构化数组
或者,你可以使用字典来定义数据和 dtype,以清晰地指定字段的名称和类型。字典中的每个键表示一个字段名称,与每个键关联的值定义了该字段的数据类型。
示例
在这个示例中,我们使用字典格式定义结构化数组的 dtype,以指定 "name"、"age" 和 "height" 字段。然后创建并显示这个结构化数组及其相应数据,将其组织成支持每个记录中多种数据类型的格式 −
import numpy as np
# 使用字典定义 dtype
dtype = np.dtype([('name', 'U10'), ('age', 'i4'), ('height', 'f4')])
# 定义数据
data = [('Alice', 30, 5.6), ('Bob', 25, 5.8), ('Charlie', 35, 5.9)]
# 创建结构化数组
structured_array = np.array(data, dtype=dtype)
print("Structured Array from Dictionary:\n", structured_array)
这将产生以下结果 −
Structured Array from Dictionary:
[('Alice', 30, 5.6) ('Bob', 25, 5.8) ('Charlie', 35, 5.9)]