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')
创建结构化数组
定义"数据类型"后,即可通过将数据类型传递给 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 的子类时,将使用 ndarray 的子类。默认值为 False,表示返回的数组始终是 ndarray 的实例。
- ndmin(可选):这指定了结果数组应具有的最小维数。例如,设置 ndmin=2 可确保结果至少为二维数组。
示例
在下面的示例中,我们定义了一个具有指定数据类型的结构化数组,其中包含"name"、"age"和"height"字段。然后,我们创建包含与此结构匹配的数据的数组,并打印生成的结构化数组 -
import numpy as 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)
以下是获得的输出 -
结构化数组: [('Alice', 30, 5.6) ('Bob', 25, 5.8) ('Charlie', 35, 5.9)]
创建具有不同数据类型的结构化数组
您可以根据应用程序的需求,创建具有各种数据类型的结构化数组,包括字符串、整数和浮点数。
在结构化数组的上下文中 -
- 字符串:您可以在结构化数组中存储文本数据。例如,姓名字段可能使用字符串数据类型。
- 整数:数值数据(例如年龄或计数)可以存储为整数。这可能包括年龄或数量等整数数据。
- 浮点数:对于小数或实数,您可以使用浮点数据类型。这对于测量值或任何需要精度的值(例如身高或体重)非常有用。
示例
在以下示例中,我们将创建一个结构化数组,其数据类型 (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)
这将产生以下结果 -
包含混合数据类型的结构化数组:[(1, 'Alice', 88.5) (2, 'Bob', 91.2) (3, 'Charlie', 85.4)]
使用元组列表创建结构化数组
您可以定义数据类型并使用元组列表创建结构化数组,其中每个元组代表一个字段。每个元组包含两个元素:第一个元素是字段的名称,第二个元素是该字段的数据类型。
示例
在下面的示例中,我们将使用指定的数据类型定义一个包含"name"、"age"和"height"字段的结构化数组。然后,我们创建这个包含相应数据的数组 -
import numpy as 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)
以下是得到的输出 -
结构化数组: [('Alice', 30, 5.6) ('Bob', 25, 5.8) ('Charlie', 35, 5.9)]
使用字典创建结构化数组
或者,您可以使用字典定义数据和数据类型,以明确指定字段的名称和类型。字典中的每个键代表一个字段名称,与每个键关联的值定义该字段的数据类型。
示例
在此示例中,我们使用字典格式定义结构化数组的数据类型,以指定"name"、"age"和"height"等字段。然后,我们创建并显示此结构化数组及其相应的数据,并将其组织成一种支持每条记录中多种数据类型的格式 -
import numpy as np # 使用字典定义数据类型 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)
这将产生以下结果−
来自字典的结构化数组: [('Alice', 30, 5.6) ('Bob', 25, 5.8) ('Charlie', 35, 5.9)]