Numpy:加入结构化数组

作者:编程家 分类: python 时间:2025-04-25

使用Numpy的结构化数组可以方便地处理具有不同数据类型的数据。结构化数组是一种可以包含不同数据类型的多维数组,每个元素可以由多个字段组成。这使得我们可以将表格数据或数据库的数据导入到Numpy数组中,并且可以通过字段名称来访问和操作数据。接下来,我们将介绍如何创建和使用结构化数组,并通过一个案例代码来演示其用法。

创建结构化数组

要创建结构化数组,我们可以使用`numpy.array()`函数,并在`dtype`参数中指定每个字段的名称和数据类型。每个字段需要以元组的形式表示,其中包含字段名称和字段数据类型。下面是一个例子:

python

import numpy as np

# 创建结构化数组

data = np.array([(1, "John", 28), (2, "Alice", 32), (3, "Bob", 25)],

dtype=[("id", int), ("name", "U10"), ("age", int)])

print(data)

输出结果为:

[(1, 'John', 28) (2, 'Alice', 32) (3, 'Bob', 25)]

可以看到,结构化数组中的每个元素由三个字段组成:id、name和age。id和age的数据类型为整数,name的数据类型为Unicode字符串。

访问结构化数组

通过字段名称,我们可以方便地访问结构化数组中的数据。例如,要访问name字段的所有值,我们可以使用以下方式:

python

names = data["name"]

print(names)

输出结果为:

['John' 'Alice' 'Bob']

我们也可以通过索引来访问结构化数组中的具体元素。例如,要访问第一个元素的age字段,可以使用以下方式:

python

age = data[0]["age"]

print(age)

输出结果为:

28

使用结构化数组进行计算

结构化数组可以像普通的Numpy数组一样进行计算。例如,我们可以计算所有人的平均年龄:

python

average_age = np.mean(data["age"])

print(average_age)

输出结果为:

28.333333333333332

我们还可以使用布尔索引来选择满足特定条件的元素。例如,我们可以选择年龄大于30岁的人:

python

older_than_30 = data[data["age"] > 30]

print(older_than_30)

输出结果为:

[(2, 'Alice', 32)]

案例代码

下面是一个完整的案例代码,演示了如何使用结构化数组处理学生的成绩数据。每个学生有姓名、年龄和三门科目的成绩。

python

import numpy as np

# 创建结构化数组

students = np.array([("John", 20, 80, 90, 85),

("Alice", 22, 75, 95, 88),

("Bob", 21, 90, 85, 92)],

dtype=[("name", "U10"), ("age", int), ("math", float), ("english", float), ("physics", float)])

# 计算每个学生的平均成绩

average_scores = np.mean([students["math"], students["english"], students["physics"]], axis=0)

# 添加平均成绩字段到结构化数组

students = np.lib.recfunctions.append_fields(students, "average", average_scores, usemask=False)

print(students)

输出结果为:

[('John', 20, 80., 90., 85., 85.) ('Alice', 22, 75., 95., 88., 86.) ('Bob', 21, 90., 85., 92., 89.)]

可以看到,我们计算了每个学生的平均成绩,并将其作为一个新的字段添加到结构化数组中。