NumPy - 结构化数组
NumPy 中的结构化数组
NumPy 中的结构化数组是指每个元素都是复合数据类型的数组。这种复合数据类型可以包含多个字段,每个字段都有自己的数据类型,类似于表或记录。
例如,您可以创建一个数组,其中每个元素同时包含姓名(字符串)和年龄(整数)。这有助于您更灵活地处理复杂数据,因为您可以分别访问和操作每个字段。
创建结构化数组
创建结构化数组的第一步是定义指定每个元素结构的数据类型 (dtype)。 数据类型定义为元组列表或字典,其中每个元组或字典条目定义一个字段名称及其数据类型。
结构化数组中可用的数据类型如下:
- 'U10': 长度为 10 的 Unicode 字符串
- 'i4': 4 字节整数
- 'f8': 8 字节浮点数
- 'b': 布尔值
使用元组列表
您可以使用元组列表定义数据类型并创建结构化数组,其中每个元组代表一个字段。每个元组包含两个元素:第一个元素是字段的名称,第二个元素是该字段的数据类型。
示例
在下面的示例中,我们使用指定的数据类型定义了一个包含"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: ",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)]
访问结构化数组中的字段
您可以使用字段名称访问结构化数组中的各个字段。方法是使用字段名称作为字符串对数组进行索引。
示例:访问各个字段
在下面的示例中,我们定义了一个包含"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) # 访问"name"字段 names =structured_array['name'] print("Names:", names) # 访问"age"字段 ages =structured_array['age'] print("Ages:", ages) # 访问"height"字段 heights =structured_array['height'] print("Heights:",身高)
以下是上述代码的输出 -
姓名:['Alice' 'Bob' 'Charlie'] 年龄:[30 25 35] 身高:[5.6 5.8 5.9]
示例:访问行
您可以使用索引访问结构化数组的特定行。这允许您检索完整的记录。这里,我们检索结构化数组的第一行和第二行 -
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) # 访问第一行 first_row =structured_array[0] print("第一行:",first_row) # 访问第二行 second_row =structured_array[1] print("第二行:", second_row)
以下是上述代码的输出 -
第一行:('Alice', 30, 5.6) 第二行:('Bob', 25, 5.8)
修改结构化数组的字段
您可以通过索引和赋值来修改结构化数组中各个字段的值。
要向结构化数组添加新字段,您可以结合使用 np.concatenate() 函数并创建包含新增字段的新数据类型。
NumPy 不支持直接向现有结构化数组添加字段。
示例:更新字段
在下面的示例中,我们将更新第一个通过直接赋值的方式将记录保存到结构化数组中 -
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) # 更新第一条记录的年龄 structured_array[0]['age'] = 31 print("更新后的结构化数组: ",structured_array)
输出结果如下−
更新后的结构化数组: [('Alice', 31, 5.6) ('Bob', 25, 5.8) ('Charlie', 35, 5.9)]
示例:添加新字段
在这里,我们通过向结构化数组的数据类型添加新字段"weight",并更新数据以包含该字段来扩展该结构化数组 −
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) # 定义一个包含附加字段"weight"的新数据类型 new_dtype = [('name', 'U10'), ('age', 'i4'), ('height', 'f4'), ('weight', 'f4')] # 定义包含附加字段的新数据 new_data = [('Alice', 30, 5.6, 55.0), ('Bob', 25, 5.8, 70.0), ('Charlie', 35, 5.9, 80.0)] # 创建一个带有附加字段的新结构化数组 new_structured_array = np.array(new_data, dtype=new_dtype) print("带有附加字段的新结构化数组: ", new_structured_array)
执行上述代码后,我们得到以下输出 -
带有附加字段的新结构化数组: [('Alice', 30, 5.6, 55.) ('Bob', 25, 5.8, 70.) ('Charlie', 35, 5.9, 80.)]
对结构化数组进行排序
在 NumPy 中对结构化数组进行排序意味着根据一个或多个字段的值对数组元素进行排序。
由于结构化数组包含多个字段,因此可以基于这些字段的值进行排序。例如,您可以按年龄或身高对人员数组进行排序。
示例
在下面的示例中,我们将根据"年龄"字段对结构化数组进行排序,首先获取按年龄升序排列的索引。然后我们使用这些索引对整个数组进行重新排序 -
import numpy as np # 定义一个结构化数组 dtype = [('name', 'U10'), ('age', 'i4')] data = [('Alice', 30), ('Bob', 25), ('Charlie', 35)] structured_array = np.array(data, dtype=dtype) # 按"年龄"对数组进行排序 sorted_indices = np.argsort(structured_array['age']) sorted_array =structured_array[sorted_indices] print("按年龄排序: ", sorted_array)
结果如下 -
按年龄排序: [('Bob', 25) ('Alice', 30) ('Charlie', 35)]
过滤结构化数组
过滤结构化数组涉及对一个或多个字段应用条件,并检索满足这些条件的元素。
当您想要检索符合特定条件的记录时,这非常有用,例如提取特定字段超过阈值或与特定值匹配的所有条目。
示例
在此示例中,我们将过滤结构化数组,使其仅包含"age"字段大于 30 的记录 -
import numpy as np # 定义结构化数组 dtype = [('name', 'U10'), ('age', 'i4')] data = [('Alice', 30), ('Bob', 25), ('Charlie', 35)] structured_array = np.array(data, dtype=dtype) # 过滤年龄大于 30 的数组 filtered_array =structured_array[structured_array['age'] > 30] print("过滤后的数组 (年龄 > 30): ", filtered_array)
我们得到如下所示的输出 −
过滤后的数组 (年龄 > 30):[('Charlie', 35)]
合并结构化数组
合并结构化数组涉及合并或连接具有已定义数据类型和已命名字段的数组。在 NumPy 中,可以使用 np.concatenate() 函数完成此操作。
示例
在下面的示例中,我们使用 np.concatenate() 函数将两个具有相同数据类型的结构化数组合并为一个数组 -
import numpy as np # 定义两个结构化数组 dtype = [('name', 'U10'), ('age', 'i4')] data1 = [('Alice', 30), ('Bob', 25)] data2 = [('Charlie', 35), ('Dave', 40)] structured_array1 = np.array(data1, dtype=dtype) structured_array2 = np.array(data2, dtype=dtype) # 合并数组 combined_array = np.concatenate((structured_array1,structured_array2)) print("合并后的结构化数组: ", combined_array)
这将生成一个新的结构化数组,其中包含两个原始数组中的所有记录,如下所示 -
合并后的结构化数组: [('Alice', 30) ('Bob', 25) ('Charlie', 35) ('Dave', 40)]