NumPy - 字段访问



NumPy 字段访问

NumPy 中的字段访问是指根据字段名称检索或修改结构化数组中的特定元素。它允许您处理数组中每个记录的各个属性或特性。

NumPy 中的结构化数组使您能够定义包含多个字段的记录数组,每个字段都有自己的数据类型。可以单独访问结构化数组中的字段,从而可以操作数据。

按名称访问单个字段

NumPy 中的结构化数组允许您为每个元素内的不同字段分配名称。此命名约定使您可以轻松地使用这些名称直接访问特定字段。

在 NumPy 中,当使用结构化数组时,访问单个字段允许您与数组中每个元素的特定组件或属性进行交互。这在处理包含多种类型数据的数组时非常重要。

示例

在以下示例中,我们访问结构化数组的“name”字段以提取并检索数组中的所有名称 -

import numpy as np

# Define a structured array with fields 'name' and 'age'
dtype = [('name', 'U10'), ('age', 'i4')]
data = [('Alice', 25), ('Bob', 30)]
structured_array = np.array(data, dtype=dtype)

# Access the 'name' field
names = structured_array['name']
print("Names:", names)

以下是获得的输出 -

Names: ['Alice' 'Bob']

多维数组中的字段访问

要访问多维结构化数组中的特定字段,您可以使用类似于一维和二维数组中使用的索引技术,但应用于多个维度。

多维结构化数组是一个数组,其中每个元素本身都是一个结构化数组,这些元素按多个维度(例如,二维、三维数组)组织。数组中的每个元素都可以有多个字段,类似于一个表,其中每一行都是一个具有多个属性的记录。

示例

在下面的示例中,我们访问三维结构化数组的第一层中的“name”字段 -

import numpy as np

# Define a 3D structured array
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)

# Access the 'name' field from the first layer
names_layer_0 = structured_array_3d[0]['name']
print("Names in the first layer:\n", names_layer_0)

以下是上述代码的输出 -

Names in the first layer:
[['Alice' 'Bob']
 ['Charlie' 'David']]

访问特定切片中的字段

访问特定切片中的字段意味着从结构化数组中的特定子集或数据范围检索值。

当您切片结构化数组的单个维度时,您可以访问结果切片中的特定字段。要访问涉及多个维度的切片中的字段,您需要跨维度应用切片,然后从结果子数组中选择字段。

示例:切片一维和访问字段

在以下示例中,我们对结构化数组进行切片以获取行子集,具体为第 1 行和第 2 行。切片后,我们访问并检索此子集中的“name”和“age”字段 -

import numpy as np

# Define a structured array with fields 'name' and 'age'
dtype = [('name', 'U10'), ('age', 'i4')]
data = [('Alice', 25), ('Bob', 30), ('Charlie', 35), ('David', 40)]
structured_array = np.array(data, dtype=dtype)

# Slice the array to get a subset of rows
sliced_array = structured_array[1:3]  # Gets rows 1 and 2

# Access the 'name' field from the sliced array
names = sliced_array['name']
# Access the 'age' field from the sliced array
ages = sliced_array['age']

print("Sliced names:", names)
print("Sliced ages:", ages)

获得的输出如下所示 -

Sliced names: ['Bob' 'Charlie']
Sliced ages: [30 35]

示例:切片二维和访问字段

在这里,我们对二维结构化数组进行切片以提取行和列的子集。然后,我们访问并检索此数组切片部分中的“name”和“age”字段 -

import numpy as np

# Define a 2D array with structured data
dtype = [('name', 'U10'), ('age', 'i4')]
data = [[('Alice', 25), ('Bob', 30)],
        [('Charlie', 35), ('David', 40)]]
structured_array = np.array(data, dtype=dtype).view(np.recarray)

# Slice the array to get a subset of rows and columns
sliced_array = structured_array[0:2, 0:2]  # Gets all rows and columns

# Access the 'name' field from the sliced array
names = sliced_array['name']
# Access the 'age' field from the sliced array
ages = sliced_array['age']

print("Sliced names:", names)
print("Sliced ages:", ages)

执行上述代码后,我们得到以下输出 -

Sliced names: 
[['Alice' 'Bob']
 ['Charlie' 'David']]
Sliced ages: 
[[25 30]
 [35 40]]

同时访问多个字段

同时访问多个字段意味着同时从结构化数组中的多个字段检索数据,允许您一起处理字段子集。

要在 NumPy 中同时访问多个字段,您可以使用以下方法 -

  • 使用字段名称列表访问:您可以指定字段名称列表以获取仅包含这些字段的结构化数组。
  • 使用结构化数组的字段索引:如果您需要按索引访问字段,则可以使用其位置选择它们。

示例

在下面的示例中,我们通过指定字段名称或索引访问结构化数组的不同字段,并打印结果。我们检索特定字段,如“name”和“age”,以及所有字段 -

import numpy as np

# Define a structured array with fields 'name', 'age', and '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. Accessing multiple fields with a list of field names
selected_fields = structured_array[['name', 'age']]
print("Selected fields (name and age):")
print(selected_fields)

# 2. Accessing fields by index
names = structured_array['name']
ages = structured_array['age']
heights = structured_array['height']

print("\nNames:", names)
print("Ages:", ages)
print("Heights:", heights)

# Accessing all fields simultaneously
all_fields = structured_array[['name', 'age', 'height']]
print("\nAll fields:")
print(all_fields)

产生的结果如下 -

Selected fields (name and age):
[('Alice', 25) ('Bob', 30) ('Charlie', 35)]

Names: ['Alice' 'Bob' 'Charlie']
Ages: [25 30 35]
Heights: [5.5 6.  5.8]

All fields:
[('Alice', 25, 5.5) ('Bob', 30, 6. ) ('Charlie', 35, 5.8)]

将字段访问与布尔索引结合使用

将字段访问与布尔索引结合使用是指根据应用于数组的条件或过滤器从结构化数组中检索特定字段。

布尔索引允许您选择满足给定条件的数组元素。通过将布尔掩码(一个布尔值数组)应用于结构化数组,您可以根据应用于一个或多个字段的条件过滤数组。

示例

在以下示例中,我们使用布尔掩码根据“age”字段过滤结构化数组。然后,我们选择并打印“age”大于 30 的条目的“name”和“height”字段 -

import numpy as np

# Define a structured array
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)

# Create a boolean mask for filtering based on 'age'
mask = structured_array['age'] > 30

# Apply boolean indexing and select 'name' and 'height' fields
filtered_fields = structured_array[mask][['name', 'height']]
print("Filtered Fields (name and height) where age > 30:\n", filtered_fields)

我们得到如下所示的输出 -

Filtered Fields (name and height) where age > 30:[('Charlie', 5.8) ('David', 6.2)]
广告