网易首页 > 网易号 > 正文 申请入驻

人工智能通识课:NumPy 数组计算

0
分享至

人工智能中的大量问题,无论是数据预处理、特征表示、模型输入,还是结果计算,本质上都离不开对数值数据的组织、变换与运算。要理解后续的数据分析、机器学习乃至深度学习,就必须先理解:如何把数据表示成可计算的结构,以及如何高效地对这些数据进行批量处理。

NumPy(Numerical Python)正是 Python 中承担这一基础任务的核心工具。它以 ndarray 为中心,把标量、向量、矩阵以及更高维数据统一到同一种数组结构中,使我们能够用更简洁、更高效的方式完成索引、切片、统计、变形与运算等操作。因此,学习 NumPy,实质上是在为后续学习人工智能相关内容打地基。

安装 NumPy:

pip install numpy

导入 NumPy:

import numpy as np

本次课围绕一个具体任务展开:用 NumPy 处理一张学生成绩表。像学生成绩表这样“行列规则清楚、元素都是数值”的数据,本质上就是 NumPy 最适合处理的二维数组场景。

通过这一任务,逐步学习如何建立数组、理解结构、提取数据、完成统计、调整形状并保存结果,从而在真实问题中掌握 NumPy 的核心用法。

一、用学生成绩表理解 NumPy 数组

假设某班有 4 名学生,学习了 3 门课程:语文、数学、英语。现在要把他们的成绩整理成一张表。

print(scores)

说明:scores 就是一个 NumPy 数组对象,类型为 ndarray。

这张成绩表可以这样理解:

每一行表示一位学生;

每一列表示一门课程;

每个位置上的数值表示某位学生某门课的成绩。

这正是 NumPy 最擅长处理的数据形式,因为学生成绩表本质上是一张规则的数值型二维表。

NumPy 数组的核心特点可以概括为三点:

其一,同构性,即同一个数组中的元素通常具有统一的数据类型;

其二,多维性,即它可以表示 0 维、1 维、2 维及更高维数据;

其三,规则性,即二维数组的每一行长度应一致,更高维数组的结构也必须规则。

查看 scores 的类型:

print(type(scores))

输出:

这说明它已经不是普通列表,而是 NumPy 的数组对象。

从更一般的角度看,NumPy 数组并不只用来表示成绩表。一个数、一列数据、一张二维表,甚至更高维的数据结构,都可以用数组表示。但对于入门来说,把它先理解成“适合计算的数值表格”,通常最容易把握。

二、数组的结构:维度、形状与数据类型

建立成绩表之后,第一步不是立刻做计算,而是先看清这张表本身的结构。NumPy 中最基础的几个结构属性,正好可以回答这个问题。

print("数据类型:", scores.dtype)

输出(示意):

数据类型: int64

这几个结果分别表示不同含义。

1、维度:ndim

ndim 表示数组有多少个维度。这里成绩表是二维的,所以结果是 2。

可以从数据组织方式上粗略理解为:

• 0 维数组:表示单个数值,可用于表示标量(Scalar)。

• 1 维数组:表示一组数值,可用于表示向量(Vector),但本身不区分行向量和列向量。

• 2 维数组:按行列组织数据,可用于表示矩阵(Matrix)。

• 3 维及以上数组:组织更高维的数据,例如一批二维数据表。

在人工智能中,张量(Tensor)通常用于统称这类多维数值结构,也包括标量、向量和矩阵,并不只指三维以上的数据。

2、形状:shape

shape 的返回值是一个元组,用来描述各维度的长度。

这里结果是 (4, 3),说明:

有 4 行,即 4 位学生;

有 3 列,即 3 门课程。

3、元素总数:size

size 表示数组中元素总数。这里共有 4 × 3 = 12 个成绩,所以结果是 12。

4、数据类型:dtype

dtype 表示数组中元素的数据类型。由于这里都是整数成绩,所以通常会显示为整数类型。

NumPy 数组通常要求元素类型统一,这也是它能高效进行批量运算的重要原因之一。

三、数组从哪里来:创建与基本查看

前面的成绩表是直接手工录入的,这当然是最直观的方式。

但在实际使用中,数组既可以由现有数据转换而来,也可以按规律、按模板或按随机方式批量生成。

1、把已有数据变成数组

这是最基础的方式。比如使用 np.array() 可将 Python 列表转换成 NumPy 数组:

])

或者:

arr = np.array([1, 2, 3], dtype=float)  # 显式指定元素类型为浮点型

dtype= 参数可用于显式指定数组元素类型,这在后续数值计算中很常见。

从语法上看,np.array(5) 可创建 0 维数组,np.array([1, 2, 3]) 可创建 1 维数组,np.array([[1, 2], [3, 4]]) 可创建 2 维数组。理解这一点,有助于后面进一步理解维度与形状。

2、用规律生成一组数据

例如,使用 np.arange() 生成 0 到 9 的整数:

# [0 1 2 3 4 5 6 7 8 9]

使用 np.linspace() 可生成某个区间上均匀分布的数:

# [  0.  20.  40.  60.  80. 100.]

如果想生成等比序列,可以使用 np.logspace():

 # [  10.  100. 1000.]

这类方法常用于模拟数据、构造测试数据或生成连续数值。arange() 更强调步长,linspace() 强调区间内点数,logspace() 则强调按对数刻度生成数值。

3、创建特殊数组

有时我们需要先创建一张“空白成绩表”或“模板表”,再逐步填入数据。这时可以使用:

full = np.full((4, 3), 60)

它们分别表示:

np.zeros():创建全 0 数组;

np.ones():创建全 1 数组;

np.full():创建全部填充为指定值的数组。

如果要创建单位矩阵,可以使用 np.eye() 和 np.identity():

identity_arr = np.identity(3)

单位矩阵指的是对角线全 1,其它元素全 0 的数组:

 [0. 0. 1.]]

4、创建未初始化数组

若只想先申请一块内存,而暂时不关心其中的值,可以使用 np.empty():

empty_arr = np.empty((2, 3))

需要注意,np.empty() 创建出来的数组元素值是未初始化的,因此通常不可直接当作有效数据使用,它更适合在后续会立即覆盖赋值的场景。

5、生成随机数据

如果想模拟一张随机成绩表,也可以这写:

random_scores = np.random.randint(60, 101, size=(4, 3))

seed(42) 用于固定随机结果,保证每次运行都一致;

randint(60, 101, size=(4, 3)) 表示生成一个 4 行 3 列、分数范围在 60 到 100 之间的整数数组。

四、如何取数据与改数据:索引、切片和赋值

有了成绩表之后,最自然的问题就是:怎样查看某位学生的成绩,怎样提取某门课程的数据,怎样修改录入错误的分数。这些问题都属于同一类操作:从数组中取数据、改数据。

1、查看某位学生的全部成绩

数组索引从 0 开始。支持负索引,-1 表示最后一个元素。

print("第三位学生的成绩:", scores[2])

scores[0] 表示第 0 行,即第一位学生的全部成绩。

2、查看某门课程的全部成绩

在同一对方括号中指定多个维度的索引或切片时,用逗号分隔。例如,scores[:, 0]中,冒号表示所有行,0表示第一列。只写scores[0]时,则表示取出第一行。

print("全班英语成绩:", scores[:, 2])

scores[:, 0] 表示所有学生的第 1 门课成绩;

scores[:, 1] 表示所有学生的第 2 门课成绩。

3、查看某位学生某门课程的成绩

print(scores[-1, -1])  # 最后一位学生的最后一门课程成绩

说明:[1, 2] 表示第 2 位学生、第 3 门课程。

4、提取成绩表中的一部分

一维切片的基本语法为:

array[start:stop:step]

例如,提取前两位学生的全部成绩:

print(scores[:2])

提取前两门课程的成绩:

print(scores[:, :2])

提取左上角的一个 2×2 子表:

print(scores[:2, :2])  # [start:stop] 形式切片;取前两行、前两列

这些都属于切片操作。可以把它理解成对表格的一块区域进行截取。

切片通常包含起始位置,不包含结束位置。这里的基本切片返回视图,与原数组共享底层数据;如果需要独立修改截取结果,应使用.copy(),例如part = scores[:2, :2].copy()。

5、修改分数

如果发现录入错误,也可以直接改写数组中的元素。

例如,将第一位学生的英语成绩从 80 改成 82:

print(scores)

也可以修改整行数据。例如更新第四位学生的全部成绩:

print(scores)

五、让整张表一起运算:整体运算与广播

NumPy 最核心的优势之一,就是它支持整体运算。也就是说,不必逐个元素写循环,而是可以直接让整张成绩表参与计算。

1、整体加分:数组与标量的运算

假设学校决定每门课统一加 5 分,可以直接写:

print(boosted_scores)

说明:+ 5 会自动作用到成绩表中的每一个元素上。

如果要求“最高不超过 100 分”,可以使用 np.clip():

print(boosted_scores)

这表示把所有结果限制在 0 到 100 的范围内。

2、比较目标成绩:数组与数组的运算

假设我们还想看看每位学生与目标分数之间的差距,可以建立一张目标分数表:

print(gap)

这里的减法是逐元素运算。两个形状相同的数组会在对应位置上一一相减。

3、不同课程加不同分:广播

如果不是每门课统一加 5 分,而是:

语文加 2 分;

数学加 5 分;

英语加 3 分;

那么可以这样写:

print(adjusted_scores)

说明:之所以能直接相加,是因为 NumPy 的广播机制在起作用。可以直观地理解为:这组长度为 3 的加分规则,会自动应用到每一位学生身上。

更准确地说,这是因为 scores 的形状是 (4, 3),而 bonus 的形状是 (3,),二者在列方向上可以对齐,因此能够进行广播。

六、真正开始分析成绩:统计函数与 axis

成绩表建立好了,数据也会查看和修改了,接下来最重要的任务就是统计分析。例如:

每位学生总分是多少;

每位学生平均分是多少;

各科平均分是多少;

各科最高分、最低分分别是多少。

这些问题都要用到 NumPy 的统计函数,而其中最关键的概念是 axis。

axis 可理解为“按哪一个维度进行聚合”。对一维数组而言,通常只有 axis=0;对二维数组而言,常见的是 axis=0 和 axis=1。

1、计算每位学生的总分和平均分

print("每位学生平均分:", mean_scores)

为什么这里用 axis=1?因为每一行表示一位学生,按行统计,就能得到每位学生的总体表现。

2、计算各科平均分、最高分和最低分

print("各科最低分:", subject_min)

说明:使用 axis=0,因为每一列表示一门课程,按列统计,就能得到课程维度的结果。

3、几种常见统计函数

除了总和、平均值、最大值、最小值,NumPy 还提供了几种很常见的统计函数:

print("各科最低分所在行索引:", np.argmin(scores, axis=0))

其中:

np.median():计算中位数;

np.std():计算标准差;

np.var():计算方差;

np.argmin():返回最小值位置的索引。

np.std() 和np.var()默认使用ddof=0,以参与计算的元素数量 N 为分母。若将数据视为样本,并需要按 N−1 计算样本方差,可设置ddof=1;对应的样本标准差也使用这一设置。

如果想看累积求和,也可以使用 np.cumsum():

print("第一位学生成绩累积和:", np.cumsum(scores[0]))

np.cumsum() 返回累积和,在某些分析任务中也很有用。

七、整理和扩展成绩表:变形、转置、展平与拼接

在实际使用中,我们并不只是对现有成绩表做运算,还常常需要调整表的结构。例如:

一串分数要重新整理成表格;

希望从“按学生看成绩”切换成“按课程看成绩”;

把表格展平成一维序列;

增加一位新学生;

增加一门新课程。

这些操作虽然表面不同,但本质上都属于“调整数组结构”。

1、变形:reshape()

假设现在有 12 个分数,按顺序存放在一个一维数组中:

print(table_scores)

说明:reshape(4, 3) 的含义,是把这 12 个数重新组织为 4 行 3 列的一张表。这说明,变形并不是改变数据本身,而是改变数据的组织方式。

新形状的元素总数必须与原数组一致,例如 12 个元素可以变为(4, 3),不能直接变为(4, 4)。reshape()在可能时返回视图,否则返回拷贝;赋值给新变量不会改变原数组的形状。

2、resize():原地修改形状

除了 np.reshape(),数组对象还提供arr.resize()方法,可以原地修改形状,符合条件时也可以改变元素总数。

print(arr)

这里调用的是数组方法arr.resize(),不是函数np.resize()。两者行为不同:

•arr.resize()原地修改数组,受内存所有权和引用等条件限制;增加元素时,新增位置填充为 0。

•np.resize(arr, new_shape)返回新数组;需要更多元素时,会重复原数组的数据。

如果只是重新组织现有元素,通常优先使用reshape()。

3、转置:交换观察角度

print(scores.T)

转置以后:

原来每一行表示学生;

现在每一行变成课程。

转置的意义不只是数学上的形式变化,也是在切换观察数据的角度。

4、展平:flatten() 与 ravel()

有时我们希望把二维表“拉平”为一维数组,这时可以使用展平操作。

print(flat2)

二者的区别在于:

•flatten()是数组对象的方法,例如scores.flatten(),返回独立拷贝;NumPy 没有np.flatten()这个函数。

•ravel()既可以写成scores.ravel(),也可以写成np.ravel(scores)。它在可能时返回视图,否则返回拷贝;只有共享底层数据时,修改结果才会影响原数组。

例如:

print(scores)

拷贝表示生成一份独立数据;视图表示与原数组共享底层数据,因此修改时可能联动。

5、增加一位新学生

如果新来一位学生,三门成绩分别为 91、86、88,可以这样添加:

print(new_scores)

说明:使用 np.vstack(),因为新增学生,本质上是新增一行。

6、增加一门新课程

如果现在又增加一门物理课,4 位学生的物理成绩如下:

print(scores_with_physics)

说明:使用 np.hstack(),因为新增课程,本质上是新增一列。

除了 vstack() 和 hstack(),NumPy 还提供 stack(),它的特点是新增一个维度后再堆叠数组。

变形、转置、展平和拼接,本质上都是在调整数组的组织结构。

八、综合示例:完成一次完整的成绩表分析与保存

最后,把前面的知识放到同一个示例中,完成一次较完整的成绩表分析,并把结果保存下来。

文件读写说明:

np.save() / np.load() 读写的是 NumPy 原生二进制格式 .npy,适合完整保存数组结构与数据类型;

np.savetxt() / np.loadtxt() 适合读写文本文件,便于人工查看,但读入结果默认常为浮点型;如需整数,可结合参数进一步控制。

小结

本次课以学生成绩表为例,学习了 NumPy 数组的基本概念、创建方法、结构属性、索引与切片、整体运算、统计分析、形状调整以及文件读写等内容。通过这些基础知识,可以初步建立面向数组进行数据组织与计算的认识。

应用实例:


“点赞有美意,赞赏是鼓励”

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
重磅公布!美联储宣布不加息!对A股美股影响多大?

重磅公布!美联储宣布不加息!对A股美股影响多大?

龙行天下虎
2026-10-29 03:30:16
张铭恩与女友路边争吵引热议,张铭恩发文:首先我先道歉不应该违章停车,澄清一下,她没有下跪

张铭恩与女友路边争吵引热议,张铭恩发文:首先我先道歉不应该违章停车,澄清一下,她没有下跪

韩小娱
2026-10-28 16:25:28
CBA猛料!上海男篮欲签新外援,山东男篮欲裁班顿,辽宁五人受伤

CBA猛料!上海男篮欲签新外援,山东男篮欲裁班顿,辽宁五人受伤

中国篮坛快讯
2026-10-28 13:11:32
她18岁嫁给毛主席,温柔贤惠,建国后主席特意为她破例一次!

她18岁嫁给毛主席,温柔贤惠,建国后主席特意为她破例一次!

雍亲王府
2026-10-26 10:55:16
泽连斯基称俄军对乌克兰基础设施袭击“严重升级”打击目标为乌能源设施、物流设施和城市基础设施

泽连斯基称俄军对乌克兰基础设施袭击“严重升级”打击目标为乌能源设施、物流设施和城市基础设施

每日经济新闻
2026-10-28 21:43:17
以色列选举,投票率很“疯狂”,专家:本次选举是对一系列重大问题的公投

以色列选举,投票率很“疯狂”,专家:本次选举是对一系列重大问题的公投

环球网资讯
2026-10-28 06:48:03
被清华教授实名举报论文造假后,蒋方舟时隔108天再发文:37岁这一年,走过舆论风波、跨过身体难关;其人大硕士学位已被撤销

被清华教授实名举报论文造假后,蒋方舟时隔108天再发文:37岁这一年,走过舆论风波、跨过身体难关;其人大硕士学位已被撤销

蓬勃新闻
2026-10-28 14:20:40
沃尔谈布朗塔图姆裂痕:去年塔图姆的复出是导火索

沃尔谈布朗塔图姆裂痕:去年塔图姆的复出是导火索

懂球帝
2026-10-28 21:34:17
男子花3500找了一个小姐,又觉得不过瘾,让小姐再喊个闺蜜过来“一起玩”

男子花3500找了一个小姐,又觉得不过瘾,让小姐再喊个闺蜜过来“一起玩”

张晓磊
2026-10-18 11:58:47
魏莹“陪睡”案新进展:案件细节太颠覆,三方口述揭露更多内幕!

魏莹“陪睡”案新进展:案件细节太颠覆,三方口述揭露更多内幕!

莫地方
2026-10-22 10:22:36
女明星刘涛遭遇咸猪手,男方是73岁顶奢创始人,现场画面被传播

女明星刘涛遭遇咸猪手,男方是73岁顶奢创始人,现场画面被传播

四斤
2026-10-28 19:55:50
原来他们是夫妻,《小城良方》他和老婆从校园到婚纱,恩爱30年

原来他们是夫妻,《小城良方》他和老婆从校园到婚纱,恩爱30年

小兔子的快乐
2026-10-27 21:47:42
沙特退货中国激光武器?42亿美元新单反手落地,唱衰的人你先别急

沙特退货中国激光武器?42亿美元新单反手落地,唱衰的人你先别急

浯江孤舟
2026-10-27 09:36:04
轰动全国的“91大神”庭审细节曝光,炸翻无数人

轰动全国的“91大神”庭审细节曝光,炸翻无数人

鸣金网
2026-10-18 14:17:30
万岁山NPC“胖郎中”宣布离职:4个月把了9000人的脉,拒绝景区涨薪挽留,想当一名好中医,“在这里一辈子也不可能实现”,将考医师资格证

万岁山NPC“胖郎中”宣布离职:4个月把了9000人的脉,拒绝景区涨薪挽留,想当一名好中医,“在这里一辈子也不可能实现”,将考医师资格证

极目新闻
2026-10-26 14:28:19
人社部重点严查五类退休人员!

人社部重点严查五类退休人员!

逍遥论经
2026-10-17 17:39:47
没抢过蒋万安!蒋团队抢下选前之夜凯道路权,沈伯洋到竞选总部造势

没抢过蒋万安!蒋团队抢下选前之夜凯道路权,沈伯洋到竞选总部造势

掉了颗大白兔糖
2026-10-29 03:09:40
3大因素决定台海战争打不得,郭台铭警告:一旦开战美国就会变天

3大因素决定台海战争打不得,郭台铭警告:一旦开战美国就会变天

始于初见见
2026-10-28 05:47:56
才30岁就打养生球?从场均16.7分到场均6分,“CBA饼皇”拿了大合同就开始摆烂

才30岁就打养生球?从场均16.7分到场均6分,“CBA饼皇”拿了大合同就开始摆烂

兵哥篮球故事
2026-10-28 20:57:36
公元581年,杨坚抓获了高纬的宠妃冯小怜。她美貌依旧,却几乎没有大臣愿意娶她。杨坚喜道:“快,送去李将军后院。”

公元581年,杨坚抓获了高纬的宠妃冯小怜。她美貌依旧,却几乎没有大臣愿意娶她。杨坚喜道:“快,送去李将军后院。”

沐书闲读
2026-10-28 12:55:10
2026-10-29 05:23:00
MediaTea
MediaTea
专业的数字媒体、新媒体技术
2258文章数 85关注度
往期回顾 全部

科技要闻

宇树科技前三季净利暴增270%

头条要闻

仅退款后冰柜仍插着电在使用 买家回应

头条要闻

仅退款后冰柜仍插着电在使用 买家回应

体育要闻

0胜4负与篮网国王一桌 热火字母哥赌错了?

娱乐要闻

巾帼不让须眉!章子怡拿下重磅荣誉

财经要闻

iPhone Duo七年等来一场吐槽大会

汽车要闻

首销期权益价23.98万起 2026款理想i6上市

态度原创

本地
教育
亲子
数码
房产

本地新闻

十月奔赴迪庆,解锁梅里日照金山

教育要闻

“看把你妈妈能耐的!”家长高姿态与老师交流,网友:家长把家校沟通变成个人秀,最尴尬的其实是孩子

亲子要闻

说好乖乖排队下楼,结果一看见妈妈就开启冲刺模式! # 幼儿园日常记录 #人类幼崽 来源/罗庄融媒

数码要闻

苹果公布其首款触控MacBook Pro官方设计素材

房产要闻

重新定义城芯院墅生活!33席印德华府,看见湾区墅居的时代答案

无障碍浏览 进入关怀版