NumPy - 字段访问
NumPy 字段访问
NumPy 中的字段访问是指根据字段名称检索或修改结构化数组中的特定元素。它允许您处理数组中每条记录的单个属性 (attribute) 或特性 (property)。
NumPy 中的结构化数组允许您定义包含多个字段的记录数组,每个字段都有自己的数据类型。结构化数组中的字段可以单独访问,从而允许操作数据。
通过名称访问单个字段
NumPy 中的结构化数组允许您为每个元素中的不同字段分配名称。这种命名约定使得使用这些名称直接访问特定字段变得容易。
在 NumPy 中,处理结构化数组时,访问单个字段可以让你与数组中每个元素的特定组件或属性进行交互。在处理包含多种类型数据的数组时,这一点非常重要。
示例
在以下示例中,我们将访问结构化数组的"name"字段,以提取并检索数组中的所有姓名 -
import numpy as np
# 定义一个包含"name"和"age"字段的结构化数组
dtype = [('name', 'U10'), ('age', 'i4')]
data = [('Alice', 25), ('Bob', 30)]
structured_array = np.array(data, dtype=dtype)
# 访问"name"字段
names =structured_array['name']
print("Names:", names)
以下是获得的输出 −
Names:['Alice' 'Bob']
多维数组中的字段访问
要访问多维结构化数组中的特定字段,可以使用类似于一维和二维数组中使用的索引技术,但应用于多个维度。
多维结构化数组是指每个元素本身就是一个结构化数组,并且这些元素以多维形式组织(例如,二维、三维数组)。数组中的每个元素可以包含多个字段,类似于表格,其中每一行都是具有多个属性的记录。
示例
在下面的示例中,我们从三维结构化数组的第一层访问"name"字段 -
import numpy as np
# 定义一个三维结构化数组
dtype = [('name', 'U10'), ('age', 'i4'), ('height', 'f4')]
data = [[[('Alice', 25, 5.5), ('Bob', 30, 6.0)],
[('Charlie', 35, 5.8), ('David', 40, 6.2)]],
[[('Eve', 28, 5.7), ('Frank', 33, 6.1)],
[('Grace', 29, 5.6), ('Hank', 32, 6.3)]]]
structured_array_3d = np.array(data, dtype=dtype)
# 访问第一层的"name"字段
names_layer_0 =structured_array_3d[0]['name']
print("第一层中的名称:
", names_layer_0)
以下是上述代码的输出 -
第一层中的名称: [['Alice' 'Bob'] ['Charlie' 'David']]
访问特定切片中的字段
访问特定切片中的字段意味着从结构化数组中的特定子集或数据范围中检索值。
当您对结构化数组的单个维度进行切片时,您可以从结果切片中访问特定字段。要访问涉及多维度切片的字段,您需要跨维度应用切片,然后从生成的子数组中选择字段。
示例:一维切片和访问字段
在以下示例中,我们将对结构化数组进行切片以获取行子集,具体来说是第 1 行和第 2 行。切片后,我们从该子集中访问并检索"name"和"age"字段 -
import numpy as np
# 定义一个包含"name"和"age"字段的结构化数组
dtype = [('name', 'U10'), ('age', 'i4')]
data = [('Alice', 25), ('Bob', 30), ('Charlie', 35), ('David', 40)]
structured_array = np.array(data, dtype=dtype)
# 对数组进行切片以获取行子集
sliced_array =structured_array[1:3] # 获取第 1 行和第 2 行
# 从切片后的数组中访问"name"字段
names = sliced_array['name']
# 从切片后的数组中访问"age"字段
ages = sliced_array['age']
print("切片后的 names:", names)
print("切片后的 ages:", ages)
输出结果如下所示 -
切片后的 names: ['Bob' 'Charlie'] 切片后的 ages: [30 35]
示例:二维切片并访问字段
此处,我们对一个二维结构化数组进行切片,提取行和列的子集。然后,我们从切片后的数组中访问并检索"name"和"age"字段 -
import numpy as np
# 定义一个包含结构化数据的二维数组
dtype = [('name', 'U10'), ('age', 'i4')]
data = [[('Alice', 25), ('Bob', 30)],
[('Charlie', 35), ('David', 40)]]
structured_array = np.array(data, dtype=dtype).view(np.recarray)
# 对数组进行切片以获取行和列的子集
sliced_array =structured_array[0:2, 0:2] # 获取所有行和列
# 从切片后的数组中访问"name"字段
names = sliced_array['name']
# 从切片后的数组中访问"age"字段
ages = sliced_array['age']
print("切片后的 names:", names)
print("切片后的 ages:", ages)
执行上述代码后,我们得到以下输出 -
切片后的 names: [['Alice' 'Bob'] ['Charlie' 'David']] 切片后的 ages: [[25 30] [35 40]]
同时访问多个字段
同时访问多个同时访问多个字段意味着同时从结构化数组中的多个字段检索数据,允许您同时处理多个字段的子集。
要在 NumPy 中同时访问多个字段,您可以使用以下方法 -
- 使用字段名称列表访问: 您可以在列表中指定多个字段名称,以获取仅包含这些字段的结构化数组。
- 在结构化数组中使用字段索引: 如果需要通过字段的索引访问字段,可以使用它们的位置进行选择。
示例
在下面的示例中,我们通过指定字段名称或索引来访问结构化数组的不同字段,并打印结果。我们检索特定字段(例如"name"和"age")以及所有字段 -
import numpy as np
# 定义一个包含字段"name"、"age"和"height"的结构化数组
dtype = [('name', 'U10'), ('age', 'i4'), ('height', 'f4')]
data = [('Alice', 25, 5.5), ('Bob', 30, 6.0), ('Charlie', 35, 5.8)]
structured_array = np.array(data, dtype=dtype)
# 1. 使用字段名称列表访问多个字段
selected_fields =structured_array[['name', 'age']]
print("选定字段(name 和 age):")
print(selected_fields)
# 2. 通过索引访问字段
names =structured_array['name']
ages =structured_array['age']
heights = structured_array['height']
print("
姓名:", names)
print("年龄:", ages)
print("身高:", heights)
# 同时访问所有字段
all_fields = structured_array[['name', 'age', 'height']]
print("
所有字段:")
print(all_fields)
结果如下 -
选定字段(姓名和年龄):
[('Alice', 25) ('Bob', 30) ('Charlie', 35)]
姓名:['Alice' 'Bob' 'Charlie']
年龄:[25 30 35]
身高:[5.5 6. 5.8]
所有字段:
[('Alice', 25, 5.5) ('Bob', 30, 6. ) ('Charlie', 35, 5.8)]
将字段访问与布尔索引相结合
将字段访问与布尔索引相结合意味着根据应用于数组的条件或过滤器从结构化数组中检索特定字段。
布尔索引允许您选择满足给定条件的数组元素。通过将布尔掩码(布尔值数组)应用于结构化数组,您可以根据应用于一个或多个字段的条件来过滤数组。
示例
在下面的示例中,我们使用布尔掩码根据"年龄"字段过滤结构化数组。然后,我们选择并打印"年龄"大于 30 的条目的"姓名"和"身高"字段 -
import numpy as np
# 定义一个结构化数组
dtype = [('name', 'U10'), ('age', 'i4'), ('height', 'f4')]
data = [('Alice', 25, 5.5), ('Bob', 30, 6.0), ('Charlie', 35, 5.8), ('David', 40, 6.2)]
structured_array = np.array(data, dtype=dtype)
# 创建一个布尔掩码,用于根据"年龄"进行过滤
mask =structured_array['age'] > 30
# 应用布尔索引并选择"name"和"height"字段
filtered_fields =structured_array[mask][['name','height']]
print("过滤后的字段(name 和 height),其中 age > 30:
",filtered_fields)
我们得到如下所示的输出 -
过滤后的字段(name 和 height),其中 age > 30:[('Charlie',5.8) ('David',6.2)]

