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

人工智能通识课: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.

相关推荐
热点推荐
上海一小区4个孩子光着身子满街跑五六天,母亲被找到后只说"我管不住",民警一天来三次也没用

上海一小区4个孩子光着身子满街跑五六天,母亲被找到后只说"我管不住",民警一天来三次也没用

一丝不苟的法律人
2026-10-28 16:41:38
5000人多次投票!08年C罗力压12年梅西:获BOAT大奖 一人狂投26次

5000人多次投票!08年C罗力压12年梅西:获BOAT大奖 一人狂投26次

风过乡
2026-10-29 07:07:08
体制内外退休金的巨大差距引起老百姓的很大不满!

体制内外退休金的巨大差距引起老百姓的很大不满!

逍遥论经
2026-10-08 14:57:40
央媒发文,官宣张雪新身份,移民跑路、资产转移海外传闻早有真相

央媒发文,官宣张雪新身份,移民跑路、资产转移海外传闻早有真相

秋枫凋零
2026-10-28 14:05:46
皇马骑虎难下!拒道歉仅几小时,首个赞助商发声,央视总台硬刚!

皇马骑虎难下!拒道歉仅几小时,首个赞助商发声,央视总台硬刚!

大秦壁虎白话体育
2026-10-28 17:03:10
挺好的训练装,硬是穿出不协调的感觉!

挺好的训练装,硬是穿出不协调的感觉!

穿的像个人样
2026-10-15 07:52:49
外交部:希望德方、欧方保持客观理性,同中方相向而行

外交部:希望德方、欧方保持客观理性,同中方相向而行

界面新闻
2026-10-28 15:31:47
德国总统访华仅1天,中方对他的称呼变了,8字之差释放强烈信号

德国总统访华仅1天,中方对他的称呼变了,8字之差释放强烈信号

凛若秋霜
2026-10-27 23:37:35
随着摩洛哥0-6,U17女足世界杯8强已诞生3席:1支东亚劲旅在列

随着摩洛哥0-6,U17女足世界杯8强已诞生3席:1支东亚劲旅在列

侧身凌空斩
2026-10-29 03:59:21
辽宁全面落后,不敌北京,后者将斩获6连胜

辽宁全面落后,不敌北京,后者将斩获6连胜

体育篮球弟
2026-10-29 04:31:36
晚了!中方宣布不出席,菲慌忙改口否认与台合作,结果还是失望了

晚了!中方宣布不出席,菲慌忙改口否认与台合作,结果还是失望了

潋滟晴方DAY
2026-10-28 20:28:17
《笑傲江湖2》重映遭删减,跟民族问题有关?

《笑傲江湖2》重映遭删减,跟民族问题有关?

胡影
2026-10-27 17:04:24
知名经济学家:居民不花钱,其实是因为已经进入了极限状态

知名经济学家:居民不花钱,其实是因为已经进入了极限状态

午夜搭车a
2026-10-22 01:32:16
刘畊宏直播间凉了,“老板娘”的身材戳破了多少人的减肥梦?

刘畊宏直播间凉了,“老板娘”的身材戳破了多少人的减肥梦?

看尽落尘花q
2026-08-23 19:28:46
破位!金价再次暴跌!

破位!金价再次暴跌!

业翔民安
2026-10-28 09:22:21
金价跌破860元/克,有金店1天卖出十几公斤,手镯1天补3次货都不够;女子上午买结婚“五金”,下午带亲友买金镯

金价跌破860元/克,有金店1天卖出十几公斤,手镯1天补3次货都不够;女子上午买结婚“五金”,下午带亲友买金镯

极目新闻
2026-10-27 14:56:16
心疼!iPhone Duo折叠手机,首发日开合几次“内屏开裂”!维修费竟要7998元→

心疼!iPhone Duo折叠手机,首发日开合几次“内屏开裂”!维修费竟要7998元→

新民晚报
2026-10-27 18:18:54
乌度卡:申京背部轻微拉伤,预计将缺席未来几场比赛

乌度卡:申京背部轻微拉伤,预计将缺席未来几场比赛

懂球帝
2026-10-29 06:41:31
放弃中国国籍加入英国,如今回国当CEO的姜丰后悔过吗?

放弃中国国籍加入英国,如今回国当CEO的姜丰后悔过吗?

说故事的阿袭
2026-10-28 01:57:05
魏莹“陪睡”案新进展:案件细节太颠覆,三方口述揭露更多内幕!

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

莫地方
2026-10-22 10:22:36
2026-10-29 07:35:00
MediaTea
MediaTea
专业的数字媒体、新媒体技术
2259文章数 85关注度
往期回顾 全部

科技要闻

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

头条要闻

美联储宣布维持利率不变

头条要闻

美联储宣布维持利率不变

体育要闻

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

娱乐要闻

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

财经要闻

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

汽车要闻

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

态度原创

时尚
艺术
房产
旅游
本地

10位顶流男明星比惨,给我惹哭了

艺术要闻

23张人性与爱的照片,第1张就让人破防了……

房产要闻

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

旅游要闻

广东入境游活力十足

本地新闻

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

无障碍浏览 进入关怀版