news 2026/8/22 10:01:01

NumPy 零基础学习笔记

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
NumPy 零基础学习笔记

前言

学 Python 做数据分析、机器学习,绕不开 NumPy。

Python 自带的列表做大批量数值运算效率很低,NumPy 底层是 C 写的,专门用来处理多维矩阵数据,Pandas、Matplotlib、很多机器学习库底层都依赖它。

很多同学刚上手会被一堆函数搞晕,我把日常最常用的操作整理成笔记,全部都是实际敲过的代码,跟着跑一遍就能理解。

安装如果还没装:

pip install numpy

所有代码第一行基本都是导入,行业惯例简写为 np。

import numpy as np

1. 创建 ndarray 数组

ndarray 就是 numpy 里面的数组对象,可以理解成增强版列表,支持一维、二维、三维甚至更高维CSDN博...。

1.1 从普通列表转换

list1 = [1,2,3,4,5] # 一维数组 v = np.array(list1) print(v) # 二维数组,多个一维数组嵌套 m = np.array([list1,list1,list1]) print(m) # 三维数组,多个二维数组嵌套 z = np.array([m,m,m]) print(z)

1.2 快速生成特殊数组

# 生成全0数组 a = np.zeros((2,3)) # 生成全1数组 b = np.ones((3,3)) # 全部填充指定数字 c = np.full((2,2), 5) # 单位矩阵 d = np.eye(5) print(a,b,c,d)

1.3 生成有规律的数据

  • np.arange(start,end,step):左闭右开,和 range 很像
  • np.linspace(start,end,nums):闭区间,均匀取 n 个点
r1 = np.arange(0,9,3) print(r1) # 0到1,一共21个点 r2 = np.linspace(0,1,21) print(r2)

2. 查看数组基础属性

拿到一个陌生数组,先看这几个属性,搞清楚它长什么样:

  • .shape:数组形状,几行几列
  • .ndim:维度,1 维 / 2 维 / 3 维
  • .size:总元素个数
  • .dtype:元素的数据类型(int、float 等)
arr = np.array([[1,2,3],[4,5,6]]) print(arr.shape) print(arr.ndim) print(arr.size) print(arr.dtype)

3. 数组维度变换:升维、降维

reshape () 修改形状

注意:reshape 不会改变原数组,返回新数组;-1代表让 numpy 自动计算该维度大小。

v = np.array([1,2,3,4,5,6,7,8]) # 一维转二维 r1 = v.reshape(2,4) # -1自动算 r2 = v.reshape(4,-1) print(r1)

resize()

和 reshape 不一样,resize 直接修改原始数组,没有返回值

v.resize(4,2) print(v)

高维降一维:ravel () 和 flatten ()

两个都可以把多维数组压扁成一维,但有坑,面试经常考:

  1. ravel():尽量返回视图,修改返回的数组,有可能改动原数组,省内存
  2. flatten():一定返回副本,修改返回值不会影响原数组,更安全
v = np.array([[1,2],[3,4]]) r1 = v.ravel() r2 = v.flatten() print(r1) print(r2)

4. 数组元素选取和修改

索引切片是高频操作,一维、二维、三维写法略有区别。

一维数组

array1 = np.arange(1,9) # 取单个 print(array1[1]) # 花式索引,取多个不连续 print(array1[[1,3,5]]) # 切片,左闭右开 print(array1[0:6]) # 修改 array1[0] = 100 array1[[1,3]] = 20 print(array1)

二维数组

逗号隔开,前面是,后面是

array1 = np.arange(24).reshape(4,6) # 某一个元素 第二行第五列 print(array1[1,4]) # 取一整行 print(array1[3,:]) # 取一整列 print(array1[:,3]) # 不连续的行 print(array1[[0,2],:]) # 修改 array1[1,4] = 999 print(array1)

三维数组

格式:[第几个二维矩阵,行,列]

array1 = np.arange(48).reshape(2,4,6) # 第一个二维数组,第1行全部列 print(array1[0,1,:]) # 第二个二维数组,全部行,第2列 print(array1[1,:,1])

5. 数组的拼接与切割

拼接(组合数组)

  • hstack()水平拼接(左右拼,增加列)等价于concatenate(axis=1)
  • vstack()垂直拼接(上下拼,增加行)等价于concatenate(axis=0)
array1 = np.arange(9).reshape(3,3) array2 = array1 * 2 # 水平,左右放一起 a3 = np.hstack((array1,array2)) # 垂直,上下摞起来 a7 = np.vstack((array1,array2)) # concatenate通用拼接,axis控制方向 a6 = np.concatenate((array1,array2),axis=1) a8 = np.concatenate((array1,array2),axis=0) print(a3) print(a7)

切割(拆分数组)

  • hsplit:水平切(按列切)
  • vsplit:垂直切(按行切)
  • split(arr,份数,axis=)通用切分
  • array_split:可以不均等切割,份数不能整除数组长度的时候不会报错
array1 = np.arange(16).reshape(4,4) # 水平切成2份 a = np.hsplit(array1,2) # 垂直切成2份 c = np.vsplit(array1,2) # 强制分成3份,不能整除也可以运行 e = np.array_split(array1,3,axis=1) print(a)

6. 拷贝:赋值、浅拷贝、深拷贝

这个坑非常多人踩,简单说:

  1. 直接用=赋值,只是别名,两个变量指向同一块内存,改一个另一个跟着变
  2. .copy()才是真正复制一份独立数组(深拷贝)
array1 = np.array([1,2,3]) # 只是别名,不是复制 array2 = array1 array2[0] = 100 print(array1) # array1也被改变! # copy真正拷贝 array3 = array1.copy() array3[0] = 10 print(array1) # 原始数组不受影响

7. 数组算数运算

numpy 数组的加减乘除,默认是对应位置元素逐个运算,不是矩阵乘法!要求两个数组 shape 尽量匹配。

array1 = np.arange(1,5).reshape(2,2) array2 = array1 * 2 print(array1 + array2) print(array1 - array2) print(array1 * array2) # 对应元素相乘,不是矩阵点乘 print(array1 / array2) print(array2 % array1) # 取余

注意:⚠️矩阵真正的点乘(线性代数矩阵乘法):使用dot()

a1 = array1.dot(array2) a2 = np.dot(array1,array2) print(a1)

矩阵求逆在np.linalg线性代数模块

inv_mat = np.linalg.inv(array1)

8. 常用统计函数

可以指定axis

  • axis=0:按列计算
  • axis=1:按行计算
arr = np.random.normal(size=(3,3)) print(arr.mean()) # 均值 print(arr.sum()) # 求和 print(arr.std()) # 标准差 print(arr.var()) # 方差 print(np.median(arr)) #中位数 print(arr.sum(axis=0)) #每一列求和 print(arr.sum(axis=1)) #每一行求和

9. numpy 随机模块

写模拟、生成测试数据经常用到。

# 设置随机种子,保证每次运行随机结果一样 np.random.seed(100) # 随机整数 [low,high) r1 = np.random.randint(0,10,size=(5,5)) print(r1) # 0~1之间浮点数 r2 = np.random.rand(3,3) print(r2) # 正态分布,loc均值 scale标准差 r3 = np.random.normal(loc=5,scale=2,size=(2,2)) print(r3)

10. 文件读写

处理真实数据,经常需要读取 txt 文本。np.loadtxt()读取文本,delimiter指定分隔符,比如制表符\t、逗号,savetxt把数组保存成文本文件。

# 读取制表符分隔的txt文件 data = np.loadtxt('datingTestSet2.txt', delimiter='\t') print(data) # 保存数组到文件 arr = np.array([[1,2,3],[4,5,6]]) np.savetxt('array.txt',arr)

最后

以上就是我练习 numpy 敲的大部分基础代码。

很多初学者一上来就死记一堆函数名,其实不用。记住几个关键点:

  1. numpy 数组所有元素数据类型统一
  2. 搞懂 shape、维度、axis(0 列 1 行)
  3. 分清视图和副本,ravelflatten、直接赋值和copy()
  4. 分清元素相乘*和矩阵点乘dot()

把上面这些练熟,再去学 pandas、机器学习预处理就顺畅很多。

如果对你有帮助,欢迎点赞收藏,后续会更新 pandas 学习笔记。


补充小提示

遇到报错优先检查:数组 shape 是否匹配、axis 有没有搞反、切片是不是越界、有没有忘记 copy 导致原数组被意外修改。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/22 9:57:36

Spring Boot集成Apollo配置中心:配置不生效与动态刷新问题深度解析

最近在开发一个分布式配置中心项目时,遇到了一个非常棘手的问题:应用启动后,从 Apollo 配置中心读取的配置值始终是默认值,配置变更也无法实时刷新。排查过程就像在西部荒漠里开一辆“最能蠕动的三轮车”——缓慢、颠簸且充满不确…

作者头像 李华
网站建设 2026/8/22 9:57:18

构建本地化文件格式转换工具链:从原理到Python自动化实战

在项目开发、日常办公或学习过程中,我们总会遇到文件格式不兼容的难题。一份精心制作的PPT需要转为PDF提交,一份高清视频需要压缩成MP4分享,或者一份扫描的PDF需要提取其中的文字进行编辑。手动寻找各种在线转换网站,不仅效率低下…

作者头像 李华
网站建设 2026/8/22 9:55:35

知识驱动AI智能体在学业路径规划中的架构设计与工程实践

1. 项目概述:当AI遇上学业规划,一场知识驱动的革命最近和几个高校的朋友聊天,大家不约而同地提到一个痛点:学生的学业路径规划越来越复杂。选课、学分、先修课要求、毕业条件、辅修双学位……这些信息散落在教务系统、培养方案手册…

作者头像 李华
网站建设 2026/8/22 9:55:06

yolo26柑橘果实检测数据集 如何建立 深度学习基于 YOLOv8 的柑橘果实检测系统 柑桔柑橘数据集的训练及应用 (1)

通过调用官YOLOv8模型训练柑橘果实检测数据集 如何建立 深度学习基于 YOLOv8 的柑橘果实检测系统 柑桔柑橘数据集的训练及应用 文章目录通过调用官YOLOv8模型训练柑橘果实检测数据集 如何建立 深度学习基于 YOLOv8 的柑橘果实检测系统 柑桔柑橘数据集的训练及应用数据集描述&am…

作者头像 李华
网站建设 2026/8/22 9:53:34

数学建模竞赛实战指南:从模型构建到代码实现的72小时全流程解析

1. 项目概述:一次从零到一的数模竞赛实战复盘又到了一年一度的全国大学生数学建模竞赛季,看着学弟学妹们开始组队、找资料、焦虑选题,我仿佛看到了几年前的自己。这个比赛,说难也难,它不像解一道纯粹的数学题&#xff…

作者头像 李华